Skip to content

chore(docs): fix base url paths#130

Open
coryrylan wants to merge 1 commit into
mainfrom
topic-base-path-fix
Open

chore(docs): fix base url paths#130
coryrylan wants to merge 1 commit into
mainfrom
topic-base-path-fix

Conversation

@coryrylan

@coryrylan coryrylan commented Jun 9, 2026

Copy link
Copy Markdown
Collaborator
  • Changed internal links in documentation to use root-relative paths for consistency.
  • Added a new transform for site URLs to ensure correct linking in different environments.
  • Updated various files to reflect these changes, including configuration and layout files.
  • Added tests to verify that all internal links are correctly formatted.

Summary by CodeRabbit

  • Bug Fixes

    • Corrected many documentation and examples links to consistently use root-relative absolute paths, improving navigation from nested pages.
    • Improved site URL handling for base-path deployments (including sitemap and generated context pages).
  • New Features

    • Added automated HTML URL rewriting to normalize href/src during site generation.
    • Added link-format validation tests to catch disallowed internal-link patterns before release.

@coryrylan coryrylan requested a review from jareddlc June 9, 2026 23:41
@coryrylan coryrylan self-assigned this Jun 9, 2026
@github-actions github-actions Bot added scope(core) scope(ci) scope(docs) dependencies Pull requests that update a dependency file labels Jun 9, 2026
@coderabbitai

coderabbitai Bot commented Jun 9, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

The PR systematically normalizes internal site URLs by introducing centralized URL utilities, an HTML transform for automatic rewriting during the build pipeline, and updating all code and documentation to use absolute root-relative paths instead of relative paths.

Changes

URL Normalization Infrastructure and Implementation

Layer / File(s) Summary
Shared URL utilities and path helpers
projects/site/src/_11ty/utils/site-url.js
New module exports BASE_URL, DEPLOYED_SITE_URL, and utility functions including getSiteHref(), getSitePath(), and getSiteUrl() that normalize paths and compute absolute or base-path-relative URLs depending on Eleventy's build vs. serve mode.
HTML transform with DOM-based URL rewriting
projects/site/src/_11ty/transforms/site-urls.js
New transform siteUrlsTransform parses HTML output, walks the parse5 DOM to detect and rewrite same-site relative URLs using the centralized utilities, while preserving external URLs, fragments, and template content.
Eleventy configuration and plugin integration
projects/site/eleventy.config.js
Sets pathPrefix to BASE_URL early, registers HtmlBasePlugin with environment-dependent baseHref (build: ELEMENTS_SITE_ORIGIN, serve: /), and registers the site-urls transform. Removes prior dev-server redirect.
Metadata and build environment configuration
projects/site/src/_11ty/layouts/metadata.js, projects/site/package.json
Metadata module imports and re-exports URL constants instead of computing locally. Build configuration adds ELEMENTS_SITE_URL environment variable and expands Vitest test file coverage to include layout, transform, and shortcode modules.
Layout and navigation link updates
projects/site/src/_11ty/layouts/common.js, projects/site/src/_11ty/layouts/page.11ty.js, projects/site/src/_11ty/layouts/docs.11ty.js
Sidebar navigation, header buttons, and documentation tabs updated to use absolute / and /docs/... paths instead of relative ., docs/..., or ./docs/... equivalents.
Plugin and template URL wiring
projects/site/src/_11ty/plugins/llms-txt.js, projects/site/src/_11ty/plugins/sitemap-xml.js, projects/site/src/_11ty/transforms/anchor-generator.js, projects/site/src/_11ty/templates/api.js, projects/site/src/_11ty/shortcodes/index.js
Plugins and templates now use centralized URL utilities: llms-txt.js applies HTML transform to generated context pages, sitemap-xml.js uses getSiteUrl() for entries, anchor-generator.js uses getSiteHref() for heading anchors, and api.js updates badge links to absolute paths.
Documentation and example content URL migration
projects/core/src/tabs/tabs.examples.ts, projects/site/src/index.md, projects/site/src/examples/..., projects/site/src/docs/... (100+ files), projects/site/src/_internal/metrics-carousel/metrics-carousel.ts
All documentation files (markdown, 11ty templates, examples) across foundations, elements, integrations, patterns, metrics, and skills updated to use absolute /docs/..., /examples/..., and /starters/... paths. Metrics carousel and index navigation also updated.
Transform behavior tests and link validation
projects/site/src/_11ty/transforms/site-urls.test.ts, projects/site/src/_11ty/layouts/links.test.ts
New Vitest test suite for transform validates build-mode qualification, serve-mode preservation, local preview handling, module source URLs, external schemes, templates, and non-HTML output. New links test scans authored files for disallowed relative internal-link patterns.

Sequence Diagram(s)

sequenceDiagram
  participant Browser
  participant EleventyBuild as Eleventy Build
  participant HtmlBase as HtmlBasePlugin
  participant Transform as siteUrlsTransform
  participant Utils as URL Utils
  participant Output as HTML Output
  Browser->>EleventyBuild: trigger build
  EleventyBuild->>HtmlBase: render templates
  HtmlBase->>EleventyBuild: inject base href
  EleventyBuild->>Transform: pass generated HTML
  Transform->>Utils: parse & resolve URLs
  Utils->>Transform: absolute or base-relative paths
  Transform->>Output: rewrite href/src attributes
  EleventyBuild->>Browser: serve normalized URLs
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Suggested labels

scope(pages), scope(code)

Suggested reviewers

  • jareddlc
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 16.33% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'chore(docs): fix base url paths' directly summarizes the PR's main objective—fixing internal documentation links to use root-relative paths for consistency.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch topic-base-path-fix

Comment @coderabbitai help to get the list of available commands and usage tips.

Comment thread projects/site/src/_11ty/transforms/site-urls.js Fixed
@coryrylan coryrylan requested a review from johnyanarella June 9, 2026 23:46

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
projects/site/src/_11ty/layouts/docs.11ty.js (1)

50-54: 🧹 Nitpick | 🔵 Trivial | 💤 Low value

Consider simplifying the baseTabUrl construction.

The baseTabUrl removes the leading / on line 51 (.replace('/', '')), then lines 91, 94, and 99 add it back (href="/${baseTabUrl}"). This could be simplified by keeping the leading / in baseTabUrl:

 const baseTabUrl = `${data.page.url
-  .replace('/', '')
   .replace('/api/', '/')
   .replace('/examples/', '/')
   .replace(/(.*\/data-grid\/).+/, '$1')}`;

Then use it directly:

-<a href="/${baseTabUrl}">Overview</a>
+<a href="${baseTabUrl}">Overview</a>

This would be clearer and avoid the remove-then-add pattern.

Also applies to: 91-99

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@projects/site/src/_11ty/layouts/docs.11ty.js` around lines 50 - 54, The code
builds baseTabUrl by stripping the leading '/' from data.page.url then later
prepends '/' again when creating hrefs; to simplify, stop removing the leading
slash: remove the initial .replace('/', '') from the baseTabUrl expression
(leave data.page.url as-is when applying the subsequent .replace('/api/', '/'),
.replace('/examples/', '/'), and .replace(/(.*\/data-grid\/).+/, '$1')), and
update all call sites that currently do href="/${baseTabUrl}" to use
href="${baseTabUrl}" (references: the baseTabUrl variable and the href usages
that add '/').
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@projects/site/package.json`:
- Around line 204-211: The current package.json test task watches all source
files via the "files" array which causes tests defined in the "command" (e.g.,
metadata.test.ts, links.test.ts, site-urls.test.ts, api.test.ts) to re-run on
any src change; update the "files" array to only match test files (for example
restrict to patterns like src/**/*.{test,spec}.ts or src/**/*.test.ts and
include matching .js/.md if you have test variants) so that vitest only reruns
when test files change, leaving the "command" unchanged.

In `@projects/site/src/_11ty/layouts/links.test.ts`:
- Around line 6-9: The four regex constants RELATIVE_INTERNAL_LINK_PATTERN,
BASE_PREFIXED_INTERNAL_LINK_PATTERN, JS_RELATIVE_INTERNAL_LINK_PATTERN, and
JS_BASE_PREFIXED_INTERNAL_LINK_PATTERN only account for "./" relative paths;
update each pattern to also match one or more "../" segments so "../docs/...",
"../examples/...", and "../starters/..." are caught too — modify the group that
currently matches (?:\.\/)? to allow sequences like (?:\.\.\/|\.\/)+ or a more
concise (?:\.\.\/)*\.\/? depending on desired strictness so both single and
multi-level parent traversals are rejected for both HTML and JS forms.

In `@projects/site/src/docs/metrics/testing-and-performance.11ty.js`:
- Around line 29-32: Remove the duplicate selected attribute from the wrong tab:
the first <nve-tabs-item> that links to "/docs/metrics/" currently has selected
but the page's correct active tab is the <nve-tabs-item> for "Testing &
Performance" (the one linking to "/docs/metrics/testing-and-performance/");
remove the selected attribute from the Metrics tab so only the Testing &
Performance <nve-tabs-item> remains selected to prevent conflicting active-state
behavior.

In `@projects/site/src/docs/metrics/wireit.11ty.js`:
- Line 59: Duplicate selected attribute: remove the extra selected on the
Metrics tab so only the Wireit Explorer tab remains selected. Locate the
<nve-tabs-item> element that renders the "Metrics" tab (the tag containing "<a
href=\"/docs/metrics/\">Metrics</a>") and delete the selected attribute from
that element, leaving the selected attribute only on the "Wireit Explorer"
<nve-tabs-item>.

---

Outside diff comments:
In `@projects/site/src/_11ty/layouts/docs.11ty.js`:
- Around line 50-54: The code builds baseTabUrl by stripping the leading '/'
from data.page.url then later prepends '/' again when creating hrefs; to
simplify, stop removing the leading slash: remove the initial .replace('/', '')
from the baseTabUrl expression (leave data.page.url as-is when applying the
subsequent .replace('/api/', '/'), .replace('/examples/', '/'), and
.replace(/(.*\/data-grid\/).+/, '$1')), and update all call sites that currently
do href="/${baseTabUrl}" to use href="${baseTabUrl}" (references: the baseTabUrl
variable and the href usages that add '/').
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Enterprise

Run ID: ce99f9ec-a08b-4139-a9d2-571dfc979998

📥 Commits

Reviewing files that changed from the base of the PR and between 686ff96 and da90867.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (69)
  • projects/core/src/tabs/tabs.examples.ts
  • projects/site/eleventy.config.js
  • projects/site/package.json
  • projects/site/src/_11ty/layouts/common.js
  • projects/site/src/_11ty/layouts/docs.11ty.js
  • projects/site/src/_11ty/layouts/links.test.ts
  • projects/site/src/_11ty/layouts/metadata.js
  • projects/site/src/_11ty/layouts/page.11ty.js
  • projects/site/src/_11ty/plugins/llms-txt.js
  • projects/site/src/_11ty/plugins/sitemap-xml.js
  • projects/site/src/_11ty/shortcodes/index.js
  • projects/site/src/_11ty/templates/api.js
  • projects/site/src/_11ty/transforms/anchor-generator.js
  • projects/site/src/_11ty/transforms/site-urls.js
  • projects/site/src/_11ty/transforms/site-urls.test.ts
  • projects/site/src/_11ty/utils/site-url.js
  • projects/site/src/_internal/metrics-carousel/metrics-carousel.ts
  • projects/site/src/docs/about/contributions.md
  • projects/site/src/docs/about/migration.md
  • projects/site/src/docs/about/support.md
  • projects/site/src/docs/api-design/logs.md
  • projects/site/src/docs/api-design/packaging.md
  • projects/site/src/docs/changelog/changelog.11ty.js
  • projects/site/src/docs/changelog/index.11ty.js
  • projects/site/src/docs/elements/dialog.md
  • projects/site/src/docs/elements/drawer.md
  • projects/site/src/docs/elements/dropdown.md
  • projects/site/src/docs/elements/forms/index.md
  • projects/site/src/docs/elements/icon.md
  • projects/site/src/docs/elements/notification.md
  • projects/site/src/docs/elements/page.md
  • projects/site/src/docs/elements/toast.md
  • projects/site/src/docs/elements/toggletip.md
  • projects/site/src/docs/elements/tooltip.md
  • projects/site/src/docs/foundations/iconography.md
  • projects/site/src/docs/foundations/index.md
  • projects/site/src/docs/foundations/layout/grid.md
  • projects/site/src/docs/foundations/layout/horizontal.md
  • projects/site/src/docs/foundations/layout/index.md
  • projects/site/src/docs/foundations/layout/responsive/container.md
  • projects/site/src/docs/foundations/layout/responsive/index.md
  • projects/site/src/docs/foundations/layout/responsive/viewport.md
  • projects/site/src/docs/foundations/layout/vertical.md
  • projects/site/src/docs/foundations/popovers.md
  • projects/site/src/docs/foundations/themes/index.11ty.js
  • projects/site/src/docs/foundations/typography.md
  • projects/site/src/docs/foundations/view-transitions.md
  • projects/site/src/docs/integrations/angular.md
  • projects/site/src/docs/integrations/index.11ty.js
  • projects/site/src/docs/integrations/lit.md
  • projects/site/src/docs/integrations/mcp-apps.md
  • projects/site/src/docs/integrations/shortcodes.js
  • projects/site/src/docs/internal/guidelines/component-creation.md
  • projects/site/src/docs/internal/guidelines/testing.md
  • projects/site/src/docs/metrics/api-status.11ty.js
  • projects/site/src/docs/metrics/bundle-explorer.11ty.js
  • projects/site/src/docs/metrics/index.11ty.js
  • projects/site/src/docs/metrics/metadata.11ty.js
  • projects/site/src/docs/metrics/testing-and-performance.11ty.js
  • projects/site/src/docs/metrics/wireit.11ty.js
  • projects/site/src/docs/monaco/diff-editor.md
  • projects/site/src/docs/monaco/editor.md
  • projects/site/src/docs/patterns/editor.md
  • projects/site/src/docs/patterns/index.md
  • projects/site/src/docs/patterns/panel.md
  • projects/site/src/docs/skills/index.md
  • projects/site/src/examples/examples.11ty.js
  • projects/site/src/examples/index.11ty.js
  • projects/site/src/index.md

Comment on lines +204 to 211
"command": "vitest run src/_11ty/layouts/metadata.test.ts src/_11ty/layouts/links.test.ts src/_11ty/transforms/site-urls.test.ts src/_11ty/shortcodes/api.test.ts",
"files": [
"src/docs/**/*.md",
"src/_11ty/layouts/common.js",
"src/_11ty/layouts/metadata.js",
"src/_11ty/layouts/metadata.test.ts",
"src/_11ty/shortcodes/api.js",
"src/_11ty/shortcodes/api.test.ts",
"src/**/*.js",
"src/**/*.md",
"src/**/*.ts",
"vitest.config.ts"
],
"output": []

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick | 🔵 Trivial | ⚖️ Poor tradeoff

Consider narrowing the test watch patterns to test files only.

The files array now watches all source files (src/**/*.js, src/**/*.md, src/**/*.ts) rather than just test files. This means tests will re-run whenever any source file changes, not just when test files change. While this ensures tests stay fresh, it may cause unnecessary test runs during development.

If tests should only re-run when test files change, consider:

 "files": [
-  "src/**/*.js",
-  "src/**/*.md",
-  "src/**/*.ts",
+  "src/**/*.test.ts",
+  "src/**/*.test.js",
   "vitest.config.ts"
 ],

Otherwise, if the current behavior is intentional (to ensure tests run on any source change), this is fine.

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"command": "vitest run src/_11ty/layouts/metadata.test.ts src/_11ty/layouts/links.test.ts src/_11ty/transforms/site-urls.test.ts src/_11ty/shortcodes/api.test.ts",
"files": [
"src/docs/**/*.md",
"src/_11ty/layouts/common.js",
"src/_11ty/layouts/metadata.js",
"src/_11ty/layouts/metadata.test.ts",
"src/_11ty/shortcodes/api.js",
"src/_11ty/shortcodes/api.test.ts",
"src/**/*.js",
"src/**/*.md",
"src/**/*.ts",
"vitest.config.ts"
],
"output": []
"command": "vitest run src/_11ty/layouts/metadata.test.ts src/_11ty/layouts/links.test.ts src/_11ty/transforms/site-urls.test.ts src/_11ty/shortcodes/api.test.ts",
"files": [
"src/**/*.test.ts",
"src/**/*.test.js",
"vitest.config.ts"
],
"output": []
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@projects/site/package.json` around lines 204 - 211, The current package.json
test task watches all source files via the "files" array which causes tests
defined in the "command" (e.g., metadata.test.ts, links.test.ts,
site-urls.test.ts, api.test.ts) to re-run on any src change; update the "files"
array to only match test files (for example restrict to patterns like
src/**/*.{test,spec}.ts or src/**/*.test.ts and include matching .js/.md if you
have test variants) so that vitest only reruns when test files change, leaving
the "command" unchanged.

Comment on lines +6 to +9
const RELATIVE_INTERNAL_LINK_PATTERN = /(?:href=["']|]\()(?:\.\/)?(?:docs|examples|starters)\//;
const BASE_PREFIXED_INTERNAL_LINK_PATTERN = /(?:href=["']|]\()\/elements\/(?:docs|examples|starters)\//;
const JS_RELATIVE_INTERNAL_LINK_PATTERN = /\bhref:\s*['"](?:\.\/)?(?:docs|examples|starters)\//;
const JS_BASE_PREFIXED_INTERNAL_LINK_PATTERN = /\bhref:\s*['"]\/elements\/(?:docs|examples|starters)\//;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Expand invalid-link regexes to catch ../ relative paths.

Line 6 and Line 8 only reject ./... relative links. ../docs/..., ../examples/..., and ../starters/... are still relative and currently bypass this test.

Suggested patch
-const RELATIVE_INTERNAL_LINK_PATTERN = /(?:href=["']|]\()(?:\.\/)?(?:docs|examples|starters)\//;
+const RELATIVE_INTERNAL_LINK_PATTERN = /(?:href=["']|]\()(?:(?:\.\.\/)+|\.\/)?(?:docs|examples|starters)\//;
 ...
-const JS_RELATIVE_INTERNAL_LINK_PATTERN = /\bhref:\s*['"](?:\.\/)?(?:docs|examples|starters)\//;
+const JS_RELATIVE_INTERNAL_LINK_PATTERN = /\bhref:\s*['"](?:(?:\.\.\/)+|\.\/)?(?:docs|examples|starters)\//;

As per coding guidelines, “**/*.test.ts: Follow unit testing patterns ... including ... patterns” and this test should fully enforce the intended invalid-link patterns.

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
const RELATIVE_INTERNAL_LINK_PATTERN = /(?:href=["']|]\()(?:\.\/)?(?:docs|examples|starters)\//;
const BASE_PREFIXED_INTERNAL_LINK_PATTERN = /(?:href=["']|]\()\/elements\/(?:docs|examples|starters)\//;
const JS_RELATIVE_INTERNAL_LINK_PATTERN = /\bhref:\s*['"](?:\.\/)?(?:docs|examples|starters)\//;
const JS_BASE_PREFIXED_INTERNAL_LINK_PATTERN = /\bhref:\s*['"]\/elements\/(?:docs|examples|starters)\//;
const RELATIVE_INTERNAL_LINK_PATTERN = /(?:href=["']|]\()(?:(?:\.\.\/)+|\.\/)?(?:docs|examples|starters)\//;
const BASE_PREFIXED_INTERNAL_LINK_PATTERN = /(?:href=["']|]\()\/elements\/(?:docs|examples|starters)\//;
const JS_RELATIVE_INTERNAL_LINK_PATTERN = /\bhref:\s*['"](?:(?:\.\.\/)+|\.\/)?(?:docs|examples|starters)\//;
const JS_BASE_PREFIXED_INTERNAL_LINK_PATTERN = /\bhref:\s*['"]\/elements\/(?:docs|examples|starters)\//;
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@projects/site/src/_11ty/layouts/links.test.ts` around lines 6 - 9, The four
regex constants RELATIVE_INTERNAL_LINK_PATTERN,
BASE_PREFIXED_INTERNAL_LINK_PATTERN, JS_RELATIVE_INTERNAL_LINK_PATTERN, and
JS_BASE_PREFIXED_INTERNAL_LINK_PATTERN only account for "./" relative paths;
update each pattern to also match one or more "../" segments so "../docs/...",
"../examples/...", and "../starters/..." are caught too — modify the group that
currently matches (?:\.\/)? to allow sequences like (?:\.\.\/|\.\/)+ or a more
concise (?:\.\.\/)*\.\/? depending on desired strictness so both single and
multi-level parent traversals are rejected for both HTML and JS forms.

Source: Coding guidelines

Comment on lines +29 to +32
<nve-tabs-item selected><a href="/docs/metrics/">Metrics</a></nve-tabs-item>
<nve-tabs-item><a href="/docs/metrics/api-status/">API Status</a></nve-tabs-item>
<nve-tabs-item selected><a href="/docs/metrics/testing-and-performance/">Testing &amp; Performance</a></nve-tabs-item>
<nve-tabs-item><a href="/docs/metrics/wireit/">Wireit Explorer</a></nve-tabs-item>

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Remove duplicate selected state in the metrics tab list.

At Line 29 and Line 31, two <nve-tabs-item> entries are marked selected. Keep only the current page tab selected (Testing & Performance) to avoid conflicting active-state behavior.

Suggested fix
-    <nve-tabs-item selected><a href="/docs/metrics/">Metrics</a></nve-tabs-item>
+    <nve-tabs-item><a href="/docs/metrics/">Metrics</a></nve-tabs-item>
       <nve-tabs-item><a href="/docs/metrics/api-status/">API Status</a></nve-tabs-item>
       <nve-tabs-item selected><a href="/docs/metrics/testing-and-performance/">Testing &amp; Performance</a></nve-tabs-item>
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<nve-tabs-item selected><a href="/docs/metrics/">Metrics</a></nve-tabs-item>
<nve-tabs-item><a href="/docs/metrics/api-status/">API Status</a></nve-tabs-item>
<nve-tabs-item selected><a href="/docs/metrics/testing-and-performance/">Testing &amp; Performance</a></nve-tabs-item>
<nve-tabs-item><a href="/docs/metrics/wireit/">Wireit Explorer</a></nve-tabs-item>
<nve-tabs-item><a href="/docs/metrics/">Metrics</a></nve-tabs-item>
<nve-tabs-item><a href="/docs/metrics/api-status/">API Status</a></nve-tabs-item>
<nve-tabs-item selected><a href="/docs/metrics/testing-and-performance/">Testing &amp; Performance</a></nve-tabs-item>
<nve-tabs-item><a href="/docs/metrics/wireit/">Wireit Explorer</a></nve-tabs-item>
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@projects/site/src/docs/metrics/testing-and-performance.11ty.js` around lines
29 - 32, Remove the duplicate selected attribute from the wrong tab: the first
<nve-tabs-item> that links to "/docs/metrics/" currently has selected but the
page's correct active tab is the <nve-tabs-item> for "Testing & Performance"
(the one linking to "/docs/metrics/testing-and-performance/"); remove the
selected attribute from the Metrics tab so only the Testing & Performance
<nve-tabs-item> remains selected to prevent conflicting active-state behavior.

<nve-tabs-item selected><a href="docs/metrics/wireit/">Wireit Explorer</a></nve-tabs-item>
<nve-tabs-item><a href="docs/metrics/bundle-explorer/">Bundle Explorer</a></nve-tabs-item>
<nve-tabs-item><a href="docs/metrics/metadata/">Raw Metadata</a></nve-tabs-item>
<nve-tabs-item selected><a href="/docs/metrics/">Metrics</a></nve-tabs-item>

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Remove the duplicate selected attribute.

Two tabs are marked as selected (lines 59 and 62), but only the "Wireit Explorer" tab (line 62) should be selected on this page.

🐛 Proposed fix
-      <nve-tabs-item selected><a href="/docs/metrics/">Metrics</a></nve-tabs-item>
+      <nve-tabs-item><a href="/docs/metrics/">Metrics</a></nve-tabs-item>
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<nve-tabs-item selected><a href="/docs/metrics/">Metrics</a></nve-tabs-item>
<nve-tabs-item><a href="/docs/metrics/">Metrics</a></nve-tabs-item>
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@projects/site/src/docs/metrics/wireit.11ty.js` at line 59, Duplicate selected
attribute: remove the extra selected on the Metrics tab so only the Wireit
Explorer tab remains selected. Locate the <nve-tabs-item> element that renders
the "Metrics" tab (the tag containing "<a href=\"/docs/metrics/\">Metrics</a>")
and delete the selected attribute from that element, leaving the selected
attribute only on the "Wireit Explorer" <nve-tabs-item>.

- Changed internal links in documentation to use root-relative paths for consistency.
- Added a new transform for site URLs to ensure correct linking in different environments.
- Updated various files to reflect these changes, including configuration and layout files.
- Added tests to verify that all internal links are correctly formatted.

Signed-off-by: Cory Rylan <crylan@nvidia.com>
@coryrylan coryrylan force-pushed the topic-base-path-fix branch from da90867 to 1339f0f Compare June 22, 2026 16:36
Comment on lines +6 to +12
import {
DEPLOYED_SITE_URL,
ELEMENTS_SITE_ORIGIN,
getSitePath as getBaseFreeSitePath,
getSiteHref,
getSiteUrl
} from '../utils/site-url.js';

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 6

♻️ Duplicate comments (1)
projects/site/src/docs/metrics/testing-and-performance.11ty.js (1)

29-34: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Duplicate selected attribute remains unresolved from prior review.

This issue was already flagged in a previous review comment on this file: two <nve-tabs-item> elements (lines 29 and 31) are both marked selected. Only the current page's tab (line 31, "Testing & Performance") should have the selected attribute. Remove the selected attribute from line 29 (Metrics tab).

The URL path updates from relative to absolute root-relative are correct and properly applied.

Proposed fix
-    <nve-tabs-item selected><a href="/docs/metrics/">Metrics</a></nve-tabs-item>
+    <nve-tabs-item><a href="/docs/metrics/">Metrics</a></nve-tabs-item>
       <nve-tabs-item><a href="/docs/metrics/api-status/">API Status</a></nve-tabs-item>
       <nve-tabs-item selected><a href="/docs/metrics/testing-and-performance/">Testing &amp; Performance</a></nve-tabs-item>
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@projects/site/src/docs/metrics/testing-and-performance.11ty.js` around lines
29 - 34, The first nve-tabs-item element with href="/docs/metrics/" has a
duplicate selected attribute that should not be there. Remove the selected
attribute from the first nve-tabs-item element (Metrics tab) so that only the
third nve-tabs-item element with href="/docs/metrics/testing-and-performance/"
(Testing & Performance tab) retains the selected attribute, ensuring only the
current page's tab is marked as selected.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@projects/site/src/_11ty/layouts/common.js`:
- Around line 132-396: In the renderDocsNav function, there are two issues to
fix. First, remove the dead code pattern in the first nve-tree-node where the
expanded attribute checks include a redundant `/./` pattern that never occurs
naturally in URLs. The check `data.page.url.includes('/./') || data.page.url ===
'/'` should be simplified to just `data.page.url === '/'` since the OR condition
with the root path already handles all necessary cases. Second, fix the path
inconsistency in the final nve-tree-node for the Internal Examples section where
the URL checks use `'examples/'` without a leading slash, but the href attribute
uses `'/examples/'` with a leading slash. Update all the URL check patterns in
this section to use `'/examples/'` with a leading slash to be consistent with
how all other navigation sections check their paths (e.g.,
`includes('/docs/...')`).

In `@projects/site/src/_11ty/transforms/site-urls.test.ts`:
- Around line 94-121: The test cases for siteUrlsTransform in the test file
currently only cover module scripts with type="module" attributes, leaving
non-module script URL rewriting behavior untested. Add test assertions within
one or both of the existing test cases (the production output test and the local
preview test) that verify the expected behavior when a regular non-module script
tag with a src attribute is processed by siteUrlsTransform. Include an assertion
that confirms the URL transformation for a non-module script follows the same
transformation rules as the other assets being tested.

In `@projects/site/src/docs/about/support.md`:
- Line 31: The Lit button on line 31 has a closing `</a>` tag without a
corresponding opening `<a>` tag, breaking the link functionality. Add an opening
`<a>` tag with href="/docs/integrations/lit/" before the svg-logo template tag
in the Lit button element to properly pair with the existing closing `</a>` tag
and match the structure of the other framework buttons (TypeScript, Angular,
Vue, Preact) which all have properly formed anchor links.

In `@projects/site/src/docs/foundations/layout/index.md`:
- Around line 102-104: The anchor reference in the link pointing to
`/docs/api-design/styles/#internal-host` is incorrect because the actual heading
in the styles documentation is `## **_REMOVED_** Host`, not `## Internal Host`.
Update the anchor portion of this link to match the actual heading structure in
the styles documentation so it resolves correctly. Verify what the actual anchor
should be based on the current heading in that document and correct the
reference accordingly.

In `@projects/site/src/docs/foundations/popovers.md`:
- Line 15: Fix the hyphenation in two compound adjectives in the popovers.md
documentation. In the tooltip link description, change "contextual text only
hints" to "contextual text-only hints" by adding a hyphen between "text" and
"only". Additionally, in the notification-related text, change "async non
contextual notification" to "async non-contextual notification" by adding a
hyphen between "non" and "contextual". These hyphens are necessary because the
adjectives modify the nouns that follow them as compound modifiers.

In `@projects/site/src/docs/internal/guidelines/testing.md`:
- Line 44: All the markdown links in the test type list (lines 41-45) are using
incorrect paths pointing to `/docs/internal/testing/*/` which doesn't exist.
Update all five links to use the correct path structure
`/docs/internal/guidelines/testing-*/` instead. Specifically, ensure line 44
updates the Visual Regression Tests link from `/docs/internal/testing/ssr/` to
`/docs/internal/guidelines/testing-visual/`, and apply similar corrections to
the other test type links on lines 41, 42, 43, and 45 by replacing the
`/docs/internal/testing/` portion with `/docs/internal/guidelines/testing-` in
each link.

---

Duplicate comments:
In `@projects/site/src/docs/metrics/testing-and-performance.11ty.js`:
- Around line 29-34: The first nve-tabs-item element with href="/docs/metrics/"
has a duplicate selected attribute that should not be there. Remove the selected
attribute from the first nve-tabs-item element (Metrics tab) so that only the
third nve-tabs-item element with href="/docs/metrics/testing-and-performance/"
(Testing & Performance tab) retains the selected attribute, ensuring only the
current page's tab is marked as selected.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Enterprise

Run ID: 457a32c4-6b74-4aa0-9cd2-6c2b9f78ef7d

📥 Commits

Reviewing files that changed from the base of the PR and between da90867 and 1339f0f.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (69)
  • projects/core/src/tabs/tabs.examples.ts
  • projects/site/eleventy.config.js
  • projects/site/package.json
  • projects/site/src/_11ty/layouts/common.js
  • projects/site/src/_11ty/layouts/docs.11ty.js
  • projects/site/src/_11ty/layouts/links.test.ts
  • projects/site/src/_11ty/layouts/metadata.js
  • projects/site/src/_11ty/layouts/page.11ty.js
  • projects/site/src/_11ty/plugins/llms-txt.js
  • projects/site/src/_11ty/plugins/sitemap-xml.js
  • projects/site/src/_11ty/shortcodes/index.js
  • projects/site/src/_11ty/templates/api.js
  • projects/site/src/_11ty/transforms/anchor-generator.js
  • projects/site/src/_11ty/transforms/site-urls.js
  • projects/site/src/_11ty/transforms/site-urls.test.ts
  • projects/site/src/_11ty/utils/site-url.js
  • projects/site/src/_internal/metrics-carousel/metrics-carousel.ts
  • projects/site/src/docs/about/contributions.md
  • projects/site/src/docs/about/migration.md
  • projects/site/src/docs/about/support.md
  • projects/site/src/docs/api-design/logs.md
  • projects/site/src/docs/api-design/packaging.md
  • projects/site/src/docs/changelog/changelog.11ty.js
  • projects/site/src/docs/changelog/index.11ty.js
  • projects/site/src/docs/elements/dialog.md
  • projects/site/src/docs/elements/drawer.md
  • projects/site/src/docs/elements/dropdown.md
  • projects/site/src/docs/elements/forms/index.md
  • projects/site/src/docs/elements/icon.md
  • projects/site/src/docs/elements/notification.md
  • projects/site/src/docs/elements/page.md
  • projects/site/src/docs/elements/toast.md
  • projects/site/src/docs/elements/toggletip.md
  • projects/site/src/docs/elements/tooltip.md
  • projects/site/src/docs/foundations/iconography.md
  • projects/site/src/docs/foundations/index.md
  • projects/site/src/docs/foundations/layout/grid.md
  • projects/site/src/docs/foundations/layout/horizontal.md
  • projects/site/src/docs/foundations/layout/index.md
  • projects/site/src/docs/foundations/layout/responsive/container.md
  • projects/site/src/docs/foundations/layout/responsive/index.md
  • projects/site/src/docs/foundations/layout/responsive/viewport.md
  • projects/site/src/docs/foundations/layout/vertical.md
  • projects/site/src/docs/foundations/popovers.md
  • projects/site/src/docs/foundations/themes/index.11ty.js
  • projects/site/src/docs/foundations/typography.md
  • projects/site/src/docs/foundations/view-transitions.md
  • projects/site/src/docs/integrations/angular.md
  • projects/site/src/docs/integrations/index.11ty.js
  • projects/site/src/docs/integrations/lit.md
  • projects/site/src/docs/integrations/mcp-apps.md
  • projects/site/src/docs/integrations/shortcodes.js
  • projects/site/src/docs/internal/guidelines/component-creation.md
  • projects/site/src/docs/internal/guidelines/testing.md
  • projects/site/src/docs/metrics/api-status.11ty.js
  • projects/site/src/docs/metrics/bundle-explorer.11ty.js
  • projects/site/src/docs/metrics/index.11ty.js
  • projects/site/src/docs/metrics/metadata.11ty.js
  • projects/site/src/docs/metrics/testing-and-performance.11ty.js
  • projects/site/src/docs/metrics/wireit.11ty.js
  • projects/site/src/docs/monaco/diff-editor.md
  • projects/site/src/docs/monaco/editor.md
  • projects/site/src/docs/patterns/editor.md
  • projects/site/src/docs/patterns/index.md
  • projects/site/src/docs/patterns/panel.md
  • projects/site/src/docs/skills/index.md
  • projects/site/src/examples/examples.11ty.js
  • projects/site/src/examples/index.11ty.js
  • projects/site/src/index.md

Comment on lines 132 to +396
export const renderDocsNav = data => /* html */ `
<nve-tree id="docs-nav" data-pagefind-ignore="all" behavior-expand selectable="single">
<nve-tree-node ${data.page.url === '/' || data.page.url.includes('/docs/metrics/') || data.page.url.includes('/docs/integrations/installation/') || data.page.url.includes('/docs/cli/') || data.page.url.includes('/docs/mcp/') || data.page.url.includes('/docs/skills/') || data.page.url.includes('/docs/lint/') ? 'expanded' : ''}>
<a href="./">Getting Started</a>
<nve-tree-node ${data.page.url.includes('/./') || data.page.url === '/' ? 'highlighted selected' : ''}><a href="./">Getting Started</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/integrations/installation/') ? 'highlighted selected' : ''}><a href="docs/integrations/installation/">Installation</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/cli/') ? 'highlighted selected' : ''}><a href="docs/cli/">CLI</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/mcp/') ? 'highlighted selected' : ''}><a href="docs/mcp/">MCP</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/skills/') ? 'highlighted selected' : ''}><a href="docs/skills/">Skills</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/lint/') ? 'highlighted selected' : ''}><a href="docs/lint/">Lint</a></nve-tree-node>
<a href="/">Getting Started</a>
<nve-tree-node ${data.page.url.includes('/./') || data.page.url === '/' ? 'highlighted selected' : ''}><a href="/">Getting Started</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/integrations/installation/') ? 'highlighted selected' : ''}><a href="/docs/integrations/installation/">Installation</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/cli/') ? 'highlighted selected' : ''}><a href="/docs/cli/">CLI</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/mcp/') ? 'highlighted selected' : ''}><a href="/docs/mcp/">MCP</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/skills/') ? 'highlighted selected' : ''}><a href="/docs/skills/">Skills</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/lint/') ? 'highlighted selected' : ''}><a href="/docs/lint/">Lint</a></nve-tree-node>
</nve-tree-node>

<nve-tree-node ${data.page.url.includes('/docs/integrations/') ? 'expanded' : ''}>
<a href="docs/integrations/">Integrations</a>
<nve-tree-node ${data.page.url.endsWith('/docs/integrations/') ? 'highlighted selected' : ''}><a href="docs/integrations/">Getting Started</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/integrations/angular/') ? 'highlighted selected' : ''}><a href="docs/integrations/angular/">Angular</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/integrations/bundles/') ? 'highlighted selected' : ''}><a href="docs/integrations/bundles/">Bundles</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/integrations/cdn/') ? 'highlighted selected' : ''}><a href="docs/integrations/cdn/">CDN</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/integrations/custom-elements/') ? 'highlighted selected' : ''}><a href="docs/integrations/custom-elements/">Custom Elements</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/integrations/go/') ? 'highlighted selected' : ''}><a href="docs/integrations/go/">Golang</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/integrations/hugo/') ? 'highlighted selected' : ''}><a href="docs/integrations/hugo/">Hugo</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/integrations/importmaps/') ? 'highlighted selected' : ''}><a href="docs/integrations/importmaps/">Import Maps</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/integrations/lit/') ? 'highlighted selected' : ''}><a href="docs/integrations/lit/">Lit</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/integrations/lit-library/') ? 'highlighted selected' : ''}><a href="docs/integrations/lit-library/">Lit Library</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/integrations/mcp-apps/') ? 'highlighted selected' : ''}><a href="docs/integrations/mcp-apps/">MCP Apps</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/integrations/nextjs/') ? 'highlighted selected' : ''}><a href="docs/integrations/nextjs/">NextJS</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/integrations/nuxt/') ? 'highlighted selected' : ''}><a href="docs/integrations/nuxt/">Nuxt</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/integrations/preact/') ? 'highlighted selected' : ''}><a href="docs/integrations/preact/">Preact</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/integrations/react/') ? 'highlighted selected' : ''}><a href="docs/integrations/react/">React</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/integrations/solidjs/') ? 'highlighted selected' : ''}><a href="docs/integrations/solidjs/">SolidJS</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/integrations/svelte/') ? 'highlighted selected' : ''}><a href="docs/integrations/svelte/">Svelte</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/integrations/typescript/') ? 'highlighted selected' : ''}><a href="docs/integrations/typescript/">TypeScript</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/integrations/vue/') ? 'highlighted selected' : ''}><a href="docs/integrations/vue/">Vue</a></nve-tree-node>
<a href="/docs/integrations/">Integrations</a>
<nve-tree-node ${data.page.url.endsWith('/docs/integrations/') ? 'highlighted selected' : ''}><a href="/docs/integrations/">Getting Started</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/integrations/angular/') ? 'highlighted selected' : ''}><a href="/docs/integrations/angular/">Angular</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/integrations/bundles/') ? 'highlighted selected' : ''}><a href="/docs/integrations/bundles/">Bundles</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/integrations/cdn/') ? 'highlighted selected' : ''}><a href="/docs/integrations/cdn/">CDN</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/integrations/custom-elements/') ? 'highlighted selected' : ''}><a href="/docs/integrations/custom-elements/">Custom Elements</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/integrations/go/') ? 'highlighted selected' : ''}><a href="/docs/integrations/go/">Golang</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/integrations/hugo/') ? 'highlighted selected' : ''}><a href="/docs/integrations/hugo/">Hugo</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/integrations/importmaps/') ? 'highlighted selected' : ''}><a href="/docs/integrations/importmaps/">Import Maps</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/integrations/lit/') ? 'highlighted selected' : ''}><a href="/docs/integrations/lit/">Lit</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/integrations/lit-library/') ? 'highlighted selected' : ''}><a href="/docs/integrations/lit-library/">Lit Library</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/integrations/mcp-apps/') ? 'highlighted selected' : ''}><a href="/docs/integrations/mcp-apps/">MCP Apps</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/integrations/nextjs/') ? 'highlighted selected' : ''}><a href="/docs/integrations/nextjs/">NextJS</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/integrations/nuxt/') ? 'highlighted selected' : ''}><a href="/docs/integrations/nuxt/">Nuxt</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/integrations/preact/') ? 'highlighted selected' : ''}><a href="/docs/integrations/preact/">Preact</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/integrations/react/') ? 'highlighted selected' : ''}><a href="/docs/integrations/react/">React</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/integrations/solidjs/') ? 'highlighted selected' : ''}><a href="/docs/integrations/solidjs/">SolidJS</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/integrations/svelte/') ? 'highlighted selected' : ''}><a href="/docs/integrations/svelte/">Svelte</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/integrations/typescript/') ? 'highlighted selected' : ''}><a href="/docs/integrations/typescript/">TypeScript</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/integrations/vue/') ? 'highlighted selected' : ''}><a href="/docs/integrations/vue/">Vue</a></nve-tree-node>
</nve-tree-node>

<nve-tree-node ${data.page.url.includes('/docs/metrics/') || data.page.url.includes('/docs/changelog/') || data.page.url.includes('/docs/about/') ? 'expanded' : ''}>
<a href="docs/changelog/">About</a>
<nve-tree-node ${data.page.url.includes('/docs/changelog/') ? 'highlighted selected' : ''}><a href="docs/changelog/">Changelog</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/metrics/') ? 'highlighted selected' : ''}><a href="docs/metrics/">Metrics</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/about/support/') ? 'highlighted selected' : ''}><a href="docs/about/support/">Support</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/about/accessibility/') ? 'highlighted selected' : ''}><a href="docs/about/accessibility/">Accessibility</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/about/contributions/') ? 'highlighted selected' : ''}><a href="docs/about/contributions/">Contributions</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/about/requests/') ? 'highlighted selected' : ''}><a href="docs/about/requests/">Requests</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/about/migration/') ? 'highlighted selected' : ''}><a href="docs/about/migration/">Migration</a></nve-tree-node>
<a href="/docs/changelog/">About</a>
<nve-tree-node ${data.page.url.includes('/docs/changelog/') ? 'highlighted selected' : ''}><a href="/docs/changelog/">Changelog</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/metrics/') ? 'highlighted selected' : ''}><a href="/docs/metrics/">Metrics</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/about/support/') ? 'highlighted selected' : ''}><a href="/docs/about/support/">Support</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/about/accessibility/') ? 'highlighted selected' : ''}><a href="/docs/about/accessibility/">Accessibility</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/about/contributions/') ? 'highlighted selected' : ''}><a href="/docs/about/contributions/">Contributions</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/about/requests/') ? 'highlighted selected' : ''}><a href="/docs/about/requests/">Requests</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/about/migration/') ? 'highlighted selected' : ''}><a href="/docs/about/migration/">Migration</a></nve-tree-node>
</nve-tree-node>

<nve-tree-node ${data.page.url.includes('/docs/foundations/') ? 'expanded' : ''}>
<a href="docs/foundations/">Foundations</a>
<nve-tree-node ${data.page.url.endsWith('/docs/foundations/') ? 'highlighted selected' : ''}><a href="docs/foundations/">Overview</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/foundations/typography/') ? 'highlighted selected' : ''}><a href="docs/foundations/typography/">Typography</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/foundations/iconography/') ? 'highlighted selected' : ''}><a href="docs/foundations/iconography/">Iconography</a></nve-tree-node>
<a href="/docs/foundations/">Foundations</a>
<nve-tree-node ${data.page.url.endsWith('/docs/foundations/') ? 'highlighted selected' : ''}><a href="/docs/foundations/">Overview</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/foundations/typography/') ? 'highlighted selected' : ''}><a href="/docs/foundations/typography/">Typography</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/foundations/iconography/') ? 'highlighted selected' : ''}><a href="/docs/foundations/iconography/">Iconography</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/foundations/themes/') ? 'expanded' : ''} ${data.page.url === '/docs/foundations/themes/' ? 'highlighted' : ''}>
<a href="docs/foundations/themes/">Themes</a>
<nve-tree-node ${data.page.url.includes('/docs/foundations/themes/tokens/') ? 'highlighted selected' : ''}><a href="docs/foundations/themes/tokens/">Design Tokens</a></nve-tree-node>
<nve-tree-node ${data.page.url === '/docs/foundations/themes/size/' ? 'highlighted selected' : ''}><a href="docs/foundations/themes/size/">Size & Space</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/foundations/themes/objects/') ? 'highlighted selected' : ''}><a href="docs/foundations/themes/objects/">Objects</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/foundations/themes/interactions/') ? 'highlighted selected' : ''}><a href="docs/foundations/themes/interactions/">Interactions</a></nve-tree-node>
<nve-tree-node ${data.page.url === '/docs/foundations/themes/support/' ? 'highlighted selected' : ''}><a href="docs/foundations/themes/support/">Support</a></nve-tree-node>
<nve-tree-node ${data.page.url === '/docs/foundations/themes/status/' ? 'highlighted selected' : ''}><a href="docs/foundations/themes/status/">Status</a></nve-tree-node>
<nve-tree-node ${data.page.url === '/docs/foundations/themes/color/' ? 'highlighted selected' : ''}><a href="docs/foundations/themes/color/">Color</a></nve-tree-node>
<nve-tree-node ${data.page.url === '/docs/foundations/themes/animation/' ? 'highlighted selected' : ''}><a href="docs/foundations/themes/animation/">Animation</a></nve-tree-node>
<nve-tree-node ${data.page.url === '/docs/foundations/themes/fonts/' ? 'highlighted selected' : ''}><a href="docs/foundations/themes/fonts/">Fonts</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/foundations/themes/layers/') ? 'highlighted selected' : ''}><a href="docs/foundations/themes/layers/">Layers</a></nve-tree-node>
<nve-tree-node ${data.page.url === '/docs/foundations/themes/custom/' ? 'highlighted selected' : ''}><a href="docs/foundations/themes/custom/">Custom</a></nve-tree-node>
<a href="/docs/foundations/themes/">Themes</a>
<nve-tree-node ${data.page.url.includes('/docs/foundations/themes/tokens/') ? 'highlighted selected' : ''}><a href="/docs/foundations/themes/tokens/">Design Tokens</a></nve-tree-node>
<nve-tree-node ${data.page.url === '/docs/foundations/themes/size/' ? 'highlighted selected' : ''}><a href="/docs/foundations/themes/size/">Size & Space</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/foundations/themes/objects/') ? 'highlighted selected' : ''}><a href="/docs/foundations/themes/objects/">Objects</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/foundations/themes/interactions/') ? 'highlighted selected' : ''}><a href="/docs/foundations/themes/interactions/">Interactions</a></nve-tree-node>
<nve-tree-node ${data.page.url === '/docs/foundations/themes/support/' ? 'highlighted selected' : ''}><a href="/docs/foundations/themes/support/">Support</a></nve-tree-node>
<nve-tree-node ${data.page.url === '/docs/foundations/themes/status/' ? 'highlighted selected' : ''}><a href="/docs/foundations/themes/status/">Status</a></nve-tree-node>
<nve-tree-node ${data.page.url === '/docs/foundations/themes/color/' ? 'highlighted selected' : ''}><a href="/docs/foundations/themes/color/">Color</a></nve-tree-node>
<nve-tree-node ${data.page.url === '/docs/foundations/themes/animation/' ? 'highlighted selected' : ''}><a href="/docs/foundations/themes/animation/">Animation</a></nve-tree-node>
<nve-tree-node ${data.page.url === '/docs/foundations/themes/fonts/' ? 'highlighted selected' : ''}><a href="/docs/foundations/themes/fonts/">Fonts</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/foundations/themes/layers/') ? 'highlighted selected' : ''}><a href="/docs/foundations/themes/layers/">Layers</a></nve-tree-node>
<nve-tree-node ${data.page.url === '/docs/foundations/themes/custom/' ? 'highlighted selected' : ''}><a href="/docs/foundations/themes/custom/">Custom</a></nve-tree-node>
</nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/foundations/layout/') ? 'expanded' : ''} ${data.page.url === '/docs/foundations/layout/' ? 'highlighted' : ''}>
<a href="docs/foundations/layout/">Layout</a>
<nve-tree-node ${data.page.url.includes('/docs/foundations/layout/horizontal/') ? 'highlighted selected' : ''}><a href="docs/foundations/layout/horizontal/">Horizontal</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/foundations/layout/vertical/') ? 'highlighted selected' : ''}><a href="docs/foundations/layout/vertical/">Vertical</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/foundations/layout/grid/') ? 'highlighted selected' : ''}><a href="docs/foundations/layout/grid/">Grid</a></nve-tree-node>
<a href="/docs/foundations/layout/">Layout</a>
<nve-tree-node ${data.page.url.includes('/docs/foundations/layout/horizontal/') ? 'highlighted selected' : ''}><a href="/docs/foundations/layout/horizontal/">Horizontal</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/foundations/layout/vertical/') ? 'highlighted selected' : ''}><a href="/docs/foundations/layout/vertical/">Vertical</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/foundations/layout/grid/') ? 'highlighted selected' : ''}><a href="/docs/foundations/layout/grid/">Grid</a></nve-tree-node>
</nve-tree-node>
<nve-tree-node ${data.page.url === '/docs/foundations/popovers/' ? 'highlighted selected' : ''}><a href="docs/foundations/popovers/">Popovers</a></nve-tree-node>
<nve-tree-node ${data.page.url === '/docs/foundations/i18n/' ? 'highlighted selected' : ''}><a href="docs/foundations/i18n/">i18n</a></nve-tree-node>
<nve-tree-node ${data.page.url === '/docs/foundations/visualization/' ? 'highlighted selected' : ''}><a href="docs/foundations/visualization/">Visualization</a></nve-tree-node>
<nve-tree-node ${data.page.url === '/docs/foundations/view-transitions/' ? 'highlighted selected' : ''}><a href="docs/foundations/view-transitions/">View Transitions</a></nve-tree-node>
<nve-tree-node ${data.page.url === '/docs/foundations/popovers/' ? 'highlighted selected' : ''}><a href="/docs/foundations/popovers/">Popovers</a></nve-tree-node>
<nve-tree-node ${data.page.url === '/docs/foundations/i18n/' ? 'highlighted selected' : ''}><a href="/docs/foundations/i18n/">i18n</a></nve-tree-node>
<nve-tree-node ${data.page.url === '/docs/foundations/visualization/' ? 'highlighted selected' : ''}><a href="/docs/foundations/visualization/">Visualization</a></nve-tree-node>
<nve-tree-node ${data.page.url === '/docs/foundations/view-transitions/' ? 'highlighted selected' : ''}><a href="/docs/foundations/view-transitions/">View Transitions</a></nve-tree-node>
</nve-tree-node>

<nve-tree-node ${data.page.url.includes('/docs/elements/') ? 'expanded' : ''}>
<a href="docs/elements/accordion/">Elements</a>
<nve-tree-node ${data.page.url.includes('/docs/elements/accordion/') ? 'highlighted selected' : ''}><a href="docs/elements/accordion/">Accordion</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/alert/') ? 'highlighted selected' : ''}><a href="docs/elements/alert/">Alert</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/avatar/') ? 'highlighted selected' : ''}><a href="docs/elements/avatar/">Avatar</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/badge/') ? 'highlighted selected' : ''}><a href="docs/elements/badge/">Badge</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/breadcrumb/') ? 'highlighted selected' : ''}><a href="docs/elements/breadcrumb/">Breadcrumb</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/button/') ? 'highlighted selected' : ''}><a href="docs/elements/button/">Button</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/button-group/') ? 'highlighted selected' : ''}><a href="docs/elements/button-group/">Button Group</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/card/') ? 'highlighted selected' : ''}><a href="docs/elements/card/">Card</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/chat-message/') ? 'highlighted selected' : ''}><a href="docs/elements/chat-message/">Chat Message</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/checkbox/') ? 'highlighted selected' : ''}><a href="docs/elements/checkbox/">Checkbox</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/color/') ? 'highlighted selected' : ''}><a href="docs/elements/color/">Color</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/combobox/') ? 'highlighted selected' : ''}><a href="docs/elements/combobox/">Combobox</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/copy-button/') ? 'highlighted selected' : ''}><a href="docs/elements/copy-button/">Copy Button</a></nve-tree-node>
<a href="/docs/elements/accordion/">Elements</a>
<nve-tree-node ${data.page.url.includes('/docs/elements/accordion/') ? 'highlighted selected' : ''}><a href="/docs/elements/accordion/">Accordion</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/alert/') ? 'highlighted selected' : ''}><a href="/docs/elements/alert/">Alert</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/avatar/') ? 'highlighted selected' : ''}><a href="/docs/elements/avatar/">Avatar</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/badge/') ? 'highlighted selected' : ''}><a href="/docs/elements/badge/">Badge</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/breadcrumb/') ? 'highlighted selected' : ''}><a href="/docs/elements/breadcrumb/">Breadcrumb</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/button/') ? 'highlighted selected' : ''}><a href="/docs/elements/button/">Button</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/button-group/') ? 'highlighted selected' : ''}><a href="/docs/elements/button-group/">Button Group</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/card/') ? 'highlighted selected' : ''}><a href="/docs/elements/card/">Card</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/chat-message/') ? 'highlighted selected' : ''}><a href="/docs/elements/chat-message/">Chat Message</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/checkbox/') ? 'highlighted selected' : ''}><a href="/docs/elements/checkbox/">Checkbox</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/color/') ? 'highlighted selected' : ''}><a href="/docs/elements/color/">Color</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/combobox/') ? 'highlighted selected' : ''}><a href="/docs/elements/combobox/">Combobox</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/copy-button/') ? 'highlighted selected' : ''}><a href="/docs/elements/copy-button/">Copy Button</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/data-grid/') ? 'expanded' : ''} ${data.page.url.endsWith('/docs/elements/data-grid/') || data.page.url.endsWith('/docs/elements/data-grid/api/') ? 'highlighted' : ''}>
<a href="docs/elements/data-grid/">Datagrid</a>
<nve-tree-node ${data.page.url.includes('/docs/elements/data-grid/integrations/') ? 'highlighted selected' : ''}><a href="docs/elements/data-grid/integrations/">Integrations</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/data-grid/column-action/') ? 'highlighted selected' : ''}><a href="docs/elements/data-grid/column-action/">Column Action</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/data-grid/column-alignment/') ? 'highlighted selected' : ''}><a href="docs/elements/data-grid/column-alignment/">Column Alignment</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/data-grid/column-fixed/') ? 'highlighted selected' : ''}><a href="docs/elements/data-grid/column-fixed/">Column Fixed</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/data-grid/column-width/') ? 'highlighted selected' : ''}><a href="docs/elements/data-grid/column-width/">Column width</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/data-grid/container/') ? 'highlighted selected' : ''}><a href="docs/elements/data-grid/container/">Container</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/data-grid/card/') ? 'highlighted selected' : ''}><a href="docs/elements/data-grid/card/">Card</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/data-grid/display-settings/') ? 'highlighted selected' : ''}><a href="docs/elements/data-grid/display-settings/">Display Settings</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/data-grid/footer/') ? 'highlighted selected' : ''}><a href="docs/elements/data-grid/footer/">Footer</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/data-grid/heatmap/') ? 'highlighted selected' : ''}><a href="docs/elements/data-grid/heatmap/">Heatmap</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/data-grid/keynav/') ? 'highlighted selected' : ''}><a href="docs/elements/data-grid/keynav/">Keynav</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/data-grid/multi-select/') ? 'highlighted selected' : ''}><a href="docs/elements/data-grid/multi-select/">Multi Select</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/data-grid/pagination/') ? 'highlighted selected' : ''}><a href="docs/elements/data-grid/pagination/">Pagination</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/data-grid/panel-detail/') ? 'highlighted selected' : ''}><a href="docs/elements/data-grid/panel-detail/">Panel Detail</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/data-grid/panel-grid/') ? 'highlighted selected' : ''}><a href="docs/elements/data-grid/panel-grid/">Panel Grid</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/data-grid/performance/') ? 'highlighted selected' : ''}><a href="docs/elements/data-grid/performance/">Performance</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/data-grid/placeholder/') ? 'highlighted selected' : ''}><a href="docs/elements/data-grid/placeholder/">Placeholder</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/data-grid/row-action/') ? 'highlighted selected' : ''}><a href="docs/elements/data-grid/row-action/">Row Action</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/data-grid/row-groups/') ? 'highlighted selected' : ''}><a href="docs/elements/data-grid/row-groups/">Row Groups</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/data-grid/row-sort/') ? 'highlighted selected' : ''}><a href="docs/elements/data-grid/row-sort/">Row Sort</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/data-grid/scroll-height/') ? 'highlighted selected' : ''}><a href="docs/elements/data-grid/scroll-height/">Scroll Height</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/data-grid/single-select/') ? 'highlighted selected' : ''}><a href="docs/elements/data-grid/single-select/">Single Select</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/data-grid/stripe/') ? 'highlighted selected' : ''}><a href="docs/elements/data-grid/stripe/">Stripe</a></nve-tree-node>
<a href="/docs/elements/data-grid/">Datagrid</a>
<nve-tree-node ${data.page.url.includes('/docs/elements/data-grid/integrations/') ? 'highlighted selected' : ''}><a href="/docs/elements/data-grid/integrations/">Integrations</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/data-grid/column-action/') ? 'highlighted selected' : ''}><a href="/docs/elements/data-grid/column-action/">Column Action</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/data-grid/column-alignment/') ? 'highlighted selected' : ''}><a href="/docs/elements/data-grid/column-alignment/">Column Alignment</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/data-grid/column-fixed/') ? 'highlighted selected' : ''}><a href="/docs/elements/data-grid/column-fixed/">Column Fixed</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/data-grid/column-width/') ? 'highlighted selected' : ''}><a href="/docs/elements/data-grid/column-width/">Column width</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/data-grid/container/') ? 'highlighted selected' : ''}><a href="/docs/elements/data-grid/container/">Container</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/data-grid/card/') ? 'highlighted selected' : ''}><a href="/docs/elements/data-grid/card/">Card</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/data-grid/display-settings/') ? 'highlighted selected' : ''}><a href="/docs/elements/data-grid/display-settings/">Display Settings</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/data-grid/footer/') ? 'highlighted selected' : ''}><a href="/docs/elements/data-grid/footer/">Footer</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/data-grid/heatmap/') ? 'highlighted selected' : ''}><a href="/docs/elements/data-grid/heatmap/">Heatmap</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/data-grid/keynav/') ? 'highlighted selected' : ''}><a href="/docs/elements/data-grid/keynav/">Keynav</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/data-grid/multi-select/') ? 'highlighted selected' : ''}><a href="/docs/elements/data-grid/multi-select/">Multi Select</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/data-grid/pagination/') ? 'highlighted selected' : ''}><a href="/docs/elements/data-grid/pagination/">Pagination</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/data-grid/panel-detail/') ? 'highlighted selected' : ''}><a href="/docs/elements/data-grid/panel-detail/">Panel Detail</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/data-grid/panel-grid/') ? 'highlighted selected' : ''}><a href="/docs/elements/data-grid/panel-grid/">Panel Grid</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/data-grid/performance/') ? 'highlighted selected' : ''}><a href="/docs/elements/data-grid/performance/">Performance</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/data-grid/placeholder/') ? 'highlighted selected' : ''}><a href="/docs/elements/data-grid/placeholder/">Placeholder</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/data-grid/row-action/') ? 'highlighted selected' : ''}><a href="/docs/elements/data-grid/row-action/">Row Action</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/data-grid/row-groups/') ? 'highlighted selected' : ''}><a href="/docs/elements/data-grid/row-groups/">Row Groups</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/data-grid/row-sort/') ? 'highlighted selected' : ''}><a href="/docs/elements/data-grid/row-sort/">Row Sort</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/data-grid/scroll-height/') ? 'highlighted selected' : ''}><a href="/docs/elements/data-grid/scroll-height/">Scroll Height</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/data-grid/single-select/') ? 'highlighted selected' : ''}><a href="/docs/elements/data-grid/single-select/">Single Select</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/data-grid/stripe/') ? 'highlighted selected' : ''}><a href="/docs/elements/data-grid/stripe/">Stripe</a></nve-tree-node>
</nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/date/') ? 'highlighted selected' : ''}><a href="docs/elements/date/">Date</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/datetime/') ? 'highlighted selected' : ''}><a href="docs/elements/datetime/">Datetime</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/dialog/') ? 'highlighted selected' : ''}><a href="docs/elements/dialog/">Dialog</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/divider/') ? 'highlighted selected' : ''}><a href="docs/elements/divider/">Divider</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/dot/') ? 'highlighted selected' : ''}><a href="docs/elements/dot/">Dot</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/drawer/') ? 'highlighted selected' : ''}><a href="docs/elements/drawer/">Drawer</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/dropdown/') ? 'highlighted selected' : ''}><a href="docs/elements/dropdown/">Dropdown</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/dropdown-group/') ? 'highlighted selected' : ''}><a href="docs/elements/dropdown-group/">Dropdown Group</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/dropzone/') ? 'highlighted selected' : ''}><a href="docs/elements/dropzone/">Dropzone</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/file/') ? 'highlighted selected' : ''}><a href="docs/elements/file/">File</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/format-datetime/') ? 'highlighted selected' : ''}><a href="docs/elements/format-datetime/">Format Datetime</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/format-number/') ? 'highlighted selected' : ''}><a href="docs/elements/format-number/">Format Number</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/format-relative-time/') ? 'highlighted selected' : ''}><a href="docs/elements/format-relative-time/">Format Relative Time</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/date/') ? 'highlighted selected' : ''}><a href="/docs/elements/date/">Date</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/datetime/') ? 'highlighted selected' : ''}><a href="/docs/elements/datetime/">Datetime</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/dialog/') ? 'highlighted selected' : ''}><a href="/docs/elements/dialog/">Dialog</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/divider/') ? 'highlighted selected' : ''}><a href="/docs/elements/divider/">Divider</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/dot/') ? 'highlighted selected' : ''}><a href="/docs/elements/dot/">Dot</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/drawer/') ? 'highlighted selected' : ''}><a href="/docs/elements/drawer/">Drawer</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/dropdown/') ? 'highlighted selected' : ''}><a href="/docs/elements/dropdown/">Dropdown</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/dropdown-group/') ? 'highlighted selected' : ''}><a href="/docs/elements/dropdown-group/">Dropdown Group</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/dropzone/') ? 'highlighted selected' : ''}><a href="/docs/elements/dropzone/">Dropzone</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/file/') ? 'highlighted selected' : ''}><a href="/docs/elements/file/">File</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/format-datetime/') ? 'highlighted selected' : ''}><a href="/docs/elements/format-datetime/">Format Datetime</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/format-number/') ? 'highlighted selected' : ''}><a href="/docs/elements/format-number/">Format Number</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/format-relative-time/') ? 'highlighted selected' : ''}><a href="/docs/elements/format-relative-time/">Format Relative Time</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/forms/') || data.page.url.includes('/docs/elements/control/') ? 'expanded' : ''} ${data.page.url === '/docs/elements/forms/' ? 'highlighted' : ''}>
<a href="docs/elements/forms/">Forms</a>
<nve-tree-node ${data.page.url.includes('/docs/elements/forms/validation/') ? 'highlighted selected' : ''}><a href="docs/elements/forms/validation/">Validation</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/forms/actions/') ? 'highlighted selected' : ''}><a href="docs/elements/forms/actions/">Actions</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/control/') ? 'highlighted selected' : ''}><a href="docs/elements/control/">Control</a></nve-tree-node>
<a href="/docs/elements/forms/">Forms</a>
<nve-tree-node ${data.page.url.includes('/docs/elements/forms/validation/') ? 'highlighted selected' : ''}><a href="/docs/elements/forms/validation/">Validation</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/forms/actions/') ? 'highlighted selected' : ''}><a href="/docs/elements/forms/actions/">Actions</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/control/') ? 'highlighted selected' : ''}><a href="/docs/elements/control/">Control</a></nve-tree-node>
</nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/icon/') ? 'highlighted selected' : ''}><a href="docs/elements/icon/">Icon</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/icon-button/') ? 'highlighted selected' : ''}><a href="docs/elements/icon-button/">Icon Button</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/input/') ? 'highlighted selected' : ''}><a href="docs/elements/input/">Input</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/input-group/') ? 'highlighted selected' : ''}><a href="docs/elements/input-group/">Input Group</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/logo/') ? 'highlighted selected' : ''}><a href="docs/elements/logo/">Logo</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/menu/') ? 'highlighted selected' : ''}><a href="docs/elements/menu/">Menu</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/month/') ? 'highlighted selected' : ''}><a href="docs/elements/month/">Month</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/notification/') ? 'highlighted selected' : ''}><a href="docs/elements/notification/">Notification</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/page/') ? 'highlighted selected' : ''}><a href="docs/elements/page/">Page</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/page-header/') ? 'highlighted selected' : ''}><a href="docs/elements/page-header/">Page Header</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/page-loader/') ? 'highlighted selected' : ''}><a href="docs/elements/page-loader/">Page Loader</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/pagination/') ? 'highlighted selected' : ''}><a href="docs/elements/pagination/">Pagination</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/progressive-filter-chip/') ? 'highlighted selected' : ''}><a href="docs/elements/progressive-filter-chip/">Progressive Filter Chip</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/progress-bar/') ? 'highlighted selected' : ''}><a href="docs/elements/progress-bar/">Progress Bar</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/progress-ring/') ? 'highlighted selected' : ''}><a href="docs/elements/progress-ring/">Progress Ring</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/password/') ? 'highlighted selected' : ''}><a href="docs/elements/password/">Password</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/preferences-input/') ? 'highlighted selected' : ''}><a href="docs/elements/preferences-input/">Preferences Input</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/pulse/') ? 'highlighted selected' : ''}><a href="docs/elements/pulse/">Pulse</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/radio/') ? 'highlighted selected' : ''}><a href="docs/elements/radio/">Radio</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/range/') ? 'highlighted selected' : ''}><a href="docs/elements/range/">Range</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/resize-handle/') ? 'highlighted selected' : ''}><a href="docs/elements/resize-handle/">Resize Handle</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/search/') ? 'highlighted selected' : ''}><a href="docs/elements/search/">Search</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/select/') ? 'highlighted selected' : ''}><a href="docs/elements/select/">Select</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/skeleton/') ? 'highlighted selected' : ''}><a href="docs/elements/skeleton/">Skeleton</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/sort-button/') ? 'highlighted selected' : ''}><a href="docs/elements/sort-button/">Sort Button</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/sparkline/') ? 'highlighted selected' : ''}><a href="docs/elements/sparkline/">Sparkline</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/star-rating/') ? 'highlighted selected' : ''}><a href="docs/elements/star-rating/">Star Rating</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/steps/') ? 'highlighted selected' : ''}><a href="docs/elements/steps/">Steps</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/switch/') ? 'highlighted selected' : ''}><a href="docs/elements/switch/">Switch</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/tabs/') ? 'highlighted selected' : ''}><a href="docs/elements/tabs/">Tabs</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/tag/') ? 'highlighted selected' : ''}><a href="docs/elements/tag/">Tag</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/textarea/') ? 'highlighted selected' : ''}><a href="docs/elements/textarea/">Textarea</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/time/') ? 'highlighted selected' : ''}><a href="docs/elements/time/">Time</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/toast/') ? 'highlighted selected' : ''}><a href="docs/elements/toast/">Toast</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/toggletip/') ? 'highlighted selected' : ''}><a href="docs/elements/toggletip/">Toggletip</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/toolbar/') ? 'highlighted selected' : ''}><a href="docs/elements/toolbar/">Toolbar</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/tooltip/') ? 'highlighted selected' : ''}><a href="docs/elements/tooltip/">Tooltip</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/tree/') ? 'highlighted selected' : ''}><a href="docs/elements/tree/">Tree</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/week/') ? 'highlighted selected' : ''}><a href="docs/elements/week/">Week</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/icon/') ? 'highlighted selected' : ''}><a href="/docs/elements/icon/">Icon</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/icon-button/') ? 'highlighted selected' : ''}><a href="/docs/elements/icon-button/">Icon Button</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/input/') ? 'highlighted selected' : ''}><a href="/docs/elements/input/">Input</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/input-group/') ? 'highlighted selected' : ''}><a href="/docs/elements/input-group/">Input Group</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/logo/') ? 'highlighted selected' : ''}><a href="/docs/elements/logo/">Logo</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/menu/') ? 'highlighted selected' : ''}><a href="/docs/elements/menu/">Menu</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/month/') ? 'highlighted selected' : ''}><a href="/docs/elements/month/">Month</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/notification/') ? 'highlighted selected' : ''}><a href="/docs/elements/notification/">Notification</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/page/') ? 'highlighted selected' : ''}><a href="/docs/elements/page/">Page</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/page-header/') ? 'highlighted selected' : ''}><a href="/docs/elements/page-header/">Page Header</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/page-loader/') ? 'highlighted selected' : ''}><a href="/docs/elements/page-loader/">Page Loader</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/pagination/') ? 'highlighted selected' : ''}><a href="/docs/elements/pagination/">Pagination</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/progressive-filter-chip/') ? 'highlighted selected' : ''}><a href="/docs/elements/progressive-filter-chip/">Progressive Filter Chip</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/progress-bar/') ? 'highlighted selected' : ''}><a href="/docs/elements/progress-bar/">Progress Bar</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/progress-ring/') ? 'highlighted selected' : ''}><a href="/docs/elements/progress-ring/">Progress Ring</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/password/') ? 'highlighted selected' : ''}><a href="/docs/elements/password/">Password</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/preferences-input/') ? 'highlighted selected' : ''}><a href="/docs/elements/preferences-input/">Preferences Input</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/pulse/') ? 'highlighted selected' : ''}><a href="/docs/elements/pulse/">Pulse</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/radio/') ? 'highlighted selected' : ''}><a href="/docs/elements/radio/">Radio</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/range/') ? 'highlighted selected' : ''}><a href="/docs/elements/range/">Range</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/resize-handle/') ? 'highlighted selected' : ''}><a href="/docs/elements/resize-handle/">Resize Handle</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/search/') ? 'highlighted selected' : ''}><a href="/docs/elements/search/">Search</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/select/') ? 'highlighted selected' : ''}><a href="/docs/elements/select/">Select</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/skeleton/') ? 'highlighted selected' : ''}><a href="/docs/elements/skeleton/">Skeleton</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/sort-button/') ? 'highlighted selected' : ''}><a href="/docs/elements/sort-button/">Sort Button</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/sparkline/') ? 'highlighted selected' : ''}><a href="/docs/elements/sparkline/">Sparkline</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/star-rating/') ? 'highlighted selected' : ''}><a href="/docs/elements/star-rating/">Star Rating</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/steps/') ? 'highlighted selected' : ''}><a href="/docs/elements/steps/">Steps</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/switch/') ? 'highlighted selected' : ''}><a href="/docs/elements/switch/">Switch</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/tabs/') ? 'highlighted selected' : ''}><a href="/docs/elements/tabs/">Tabs</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/tag/') ? 'highlighted selected' : ''}><a href="/docs/elements/tag/">Tag</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/textarea/') ? 'highlighted selected' : ''}><a href="/docs/elements/textarea/">Textarea</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/time/') ? 'highlighted selected' : ''}><a href="/docs/elements/time/">Time</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/toast/') ? 'highlighted selected' : ''}><a href="/docs/elements/toast/">Toast</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/toggletip/') ? 'highlighted selected' : ''}><a href="/docs/elements/toggletip/">Toggletip</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/toolbar/') ? 'highlighted selected' : ''}><a href="/docs/elements/toolbar/">Toolbar</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/tooltip/') ? 'highlighted selected' : ''}><a href="/docs/elements/tooltip/">Tooltip</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/tree/') ? 'highlighted selected' : ''}><a href="/docs/elements/tree/">Tree</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/elements/week/') ? 'highlighted selected' : ''}><a href="/docs/elements/week/">Week</a></nve-tree-node>
</nve-tree-node>

<nve-tree-node ${data.page.url.includes('/docs/patterns/') ? 'expanded' : ''} ${data.page.url === '/docs/patterns/' ? 'highlighted' : ''}>
<a href="docs/patterns/">Patterns</a>
<nve-tree-node ${data.page.url.includes('/docs/patterns/authentication/') ? 'highlighted selected' : ''}><a href="docs/patterns/authentication/">Authentication</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/patterns/browse/') ? 'highlighted selected' : ''}><a href="docs/patterns/browse/">Browse</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/patterns/chat/') ? 'highlighted selected' : ''}><a href="docs/patterns/chat/">Chat</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/patterns/dashboard/') ? 'highlighted selected' : ''}><a href="docs/patterns/dashboard/">Dashboard</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/patterns/editor/') ? 'highlighted selected' : ''}><a href="docs/patterns/editor/">Editor</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/patterns/empty-states/') ? 'highlighted selected' : ''}><a href="docs/patterns/empty-states/">Empty States</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/patterns/heatmap/') ? 'highlighted selected' : ''}><a href="docs/patterns/heatmap/">Heatmap</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/patterns/keyboard-shortcut/') ? 'highlighted selected' : ''}><a href="docs/patterns/keyboard-shortcut/">Keyboard Shortcut</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/patterns/logging/') ? 'highlighted selected' : ''}><a href="docs/patterns/logging/">Logging</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/patterns/media/') ? 'highlighted selected' : ''}><a href="docs/patterns/media/">Media</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/patterns/navigation/') ? 'highlighted selected' : ''}><a href="docs/patterns/navigation/">Navigation</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/patterns/onboarding/') ? 'highlighted selected' : ''}><a href="docs/patterns/onboarding/">Onboarding</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/patterns/panel/') ? 'highlighted selected' : ''}><a href="docs/patterns/panel/">Panel</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/patterns/responsive/') ? 'highlighted selected' : ''}><a href="docs/patterns/responsive/">Responsive</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/patterns/search/') ? 'highlighted selected' : ''}><a href="docs/patterns/search/">Search</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/patterns/subheader/') ? 'highlighted selected' : ''}><a href="docs/patterns/subheader/">Subheader</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/patterns/trend/') ? 'highlighted selected' : ''}><a href="docs/patterns/trend/">Trend</a></nve-tree-node>
<a href="/docs/patterns/">Patterns</a>
<nve-tree-node ${data.page.url.includes('/docs/patterns/authentication/') ? 'highlighted selected' : ''}><a href="/docs/patterns/authentication/">Authentication</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/patterns/browse/') ? 'highlighted selected' : ''}><a href="/docs/patterns/browse/">Browse</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/patterns/chat/') ? 'highlighted selected' : ''}><a href="/docs/patterns/chat/">Chat</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/patterns/dashboard/') ? 'highlighted selected' : ''}><a href="/docs/patterns/dashboard/">Dashboard</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/patterns/editor/') ? 'highlighted selected' : ''}><a href="/docs/patterns/editor/">Editor</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/patterns/empty-states/') ? 'highlighted selected' : ''}><a href="/docs/patterns/empty-states/">Empty States</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/patterns/heatmap/') ? 'highlighted selected' : ''}><a href="/docs/patterns/heatmap/">Heatmap</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/patterns/keyboard-shortcut/') ? 'highlighted selected' : ''}><a href="/docs/patterns/keyboard-shortcut/">Keyboard Shortcut</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/patterns/logging/') ? 'highlighted selected' : ''}><a href="/docs/patterns/logging/">Logging</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/patterns/media/') ? 'highlighted selected' : ''}><a href="/docs/patterns/media/">Media</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/patterns/navigation/') ? 'highlighted selected' : ''}><a href="/docs/patterns/navigation/">Navigation</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/patterns/onboarding/') ? 'highlighted selected' : ''}><a href="/docs/patterns/onboarding/">Onboarding</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/patterns/panel/') ? 'highlighted selected' : ''}><a href="/docs/patterns/panel/">Panel</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/patterns/responsive/') ? 'highlighted selected' : ''}><a href="/docs/patterns/responsive/">Responsive</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/patterns/search/') ? 'highlighted selected' : ''}><a href="/docs/patterns/search/">Search</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/patterns/subheader/') ? 'highlighted selected' : ''}><a href="/docs/patterns/subheader/">Subheader</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/patterns/trend/') ? 'highlighted selected' : ''}><a href="/docs/patterns/trend/">Trend</a></nve-tree-node>
</nve-tree-node>

<nve-tree-node ${data.page.url.includes('/docs/code/') ? 'expanded' : ''}>
<a href="docs/code/codeblock/">Code</a>
<nve-tree-node ${data.page.url.includes('/docs/code/codeblock/') ? 'highlighted selected' : ''}><a href="docs/code/codeblock/">Codeblock</a></nve-tree-node>
<a href="/docs/code/codeblock/">Code</a>
<nve-tree-node ${data.page.url.includes('/docs/code/codeblock/') ? 'highlighted selected' : ''}><a href="/docs/code/codeblock/">Codeblock</a></nve-tree-node>
</nve-tree-node>

<nve-tree-node ${data.page.url.includes('/docs/monaco/') ? 'expanded' : ''}>
<a href="docs/monaco/input/">Monaco</a>
<nve-tree-node ${data.page.url.includes('/docs/monaco/input/') ? 'highlighted selected' : ''}><a href="docs/monaco/input/">Input</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/monaco/diff-input/') ? 'highlighted selected' : ''}><a href="docs/monaco/diff-input/">Diff Input</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/monaco/editor/') ? 'highlighted selected' : ''}><a href="docs/monaco/editor/">Editor</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/monaco/diff-editor/') ? 'highlighted selected' : ''}><a href="docs/monaco/diff-editor/">Diff Editor</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/monaco/problems/') ? 'highlighted selected' : ''}><a href="docs/monaco/problems/">Problems</a></nve-tree-node>
<a href="/docs/monaco/input/">Monaco</a>
<nve-tree-node ${data.page.url.includes('/docs/monaco/input/') ? 'highlighted selected' : ''}><a href="/docs/monaco/input/">Input</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/monaco/diff-input/') ? 'highlighted selected' : ''}><a href="/docs/monaco/diff-input/">Diff Input</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/monaco/editor/') ? 'highlighted selected' : ''}><a href="/docs/monaco/editor/">Editor</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/monaco/diff-editor/') ? 'highlighted selected' : ''}><a href="/docs/monaco/diff-editor/">Diff Editor</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/monaco/problems/') ? 'highlighted selected' : ''}><a href="/docs/monaco/problems/">Problems</a></nve-tree-node>
</nve-tree-node>

<nve-tree-node ${data.page.url.includes('/docs/markdown/') ? 'expanded' : ''}>
<a href="docs/markdown/">Markdown</a>
<nve-tree-node ${data.page.url.endsWith('/docs/markdown/') ? 'highlighted selected' : ''}><a href="docs/markdown/">Markdown</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/markdown/styles/') ? 'highlighted selected' : ''}><a href="docs/markdown/styles/">CSS Utility</a></nve-tree-node>
<a href="/docs/markdown/">Markdown</a>
<nve-tree-node ${data.page.url.endsWith('/docs/markdown/') ? 'highlighted selected' : ''}><a href="/docs/markdown/">Markdown</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/markdown/styles/') ? 'highlighted selected' : ''}><a href="/docs/markdown/styles/">CSS Utility</a></nve-tree-node>
</nve-tree-node>

<nve-tree-node ${data.page.url.includes('/docs/labs/') ? 'expanded' : ''} ${data.page.url === '/docs/labs/' ? 'highlighted' : ''}>
<a href="docs/labs/">Labs</a>
<a href="/docs/labs/">Labs</a>
<nve-tree-node ${data.page.url.includes('/docs/labs/layout/responsive/') ? 'expanded' : ''} ${data.page.url === '/docs/labs/layout/responsive/' ? 'highlighted' : ''}>
<a href="docs/labs/layout/responsive/" nve-layout="row align:vertical-center gap:xs">Responsive Layout <nve-icon name="beaker" size="sm"></nve-icon></a>
<nve-tree-node ${data.page.url.includes('/docs/labs/layout/responsive/viewport/') ? 'highlighted selected' : ''}><a href="docs/labs/layout/responsive/viewport/">Viewport</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/labs/layout/responsive/container/') ? 'highlighted selected' : ''}><a href="docs/labs/layout/responsive/container/">Container</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/labs/layout/responsive/patterns/') ? 'highlighted selected' : ''}><a href="docs/labs/layout/responsive/patterns/">Patterns</a></nve-tree-node>
<a href="/docs/labs/layout/responsive/" nve-layout="row align:vertical-center gap:xs">Responsive Layout <nve-icon name="beaker" size="sm"></nve-icon></a>
<nve-tree-node ${data.page.url.includes('/docs/labs/layout/responsive/viewport/') ? 'highlighted selected' : ''}><a href="/docs/labs/layout/responsive/viewport/">Viewport</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/labs/layout/responsive/container/') ? 'highlighted selected' : ''}><a href="/docs/labs/layout/responsive/container/">Container</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/labs/layout/responsive/patterns/') ? 'highlighted selected' : ''}><a href="/docs/labs/layout/responsive/patterns/">Patterns</a></nve-tree-node>
</nve-tree-node>
<nve-tree-node ${data.page.url === '/docs/labs/forms/' ? 'highlighted selected' : ''}><a href="docs/labs/forms/" nve-layout="row align:vertical-center gap:xs">Forms <nve-icon name="beaker" size="sm"></nve-icon></a></nve-tree-node>
<nve-tree-node ${data.page.url === '/docs/labs/forms/' ? 'highlighted selected' : ''}><a href="/docs/labs/forms/" nve-layout="row align:vertical-center gap:xs">Forms <nve-icon name="beaker" size="sm"></nve-icon></a></nve-tree-node>
</nve-tree-node>

<nve-tree-node ${data.page.url.includes('/docs/api-design/') ? 'expanded' : ''} ${data.page.url === '/docs/api-design/' ? 'highlighted' : ''}>
<a href="docs/api-design/">API Design</a>
<nve-tree-node ${data.page.url.includes('/docs/api-design/properties-attributes/') ? 'highlighted selected' : ''}><a href="docs/api-design/properties-attributes/">Properties & Attributes</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/api-design/slots/') ? 'highlighted selected' : ''}><a href="docs/api-design/slots/">Slots</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/api-design/registration/') ? 'highlighted selected' : ''}><a href="docs/api-design/registration/">Registration</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/api-design/custom-events/') ? 'highlighted selected' : ''}><a href="docs/api-design/custom-events/">CustomEvents</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/api-design/stateless/') ? 'highlighted selected' : ''}><a href="docs/api-design/stateless/">Stateless</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/api-design/composition/') ? 'highlighted selected' : ''}><a href="docs/api-design/composition/">Composition</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/api-design/styles/') ? 'highlighted selected' : ''}><a href="docs/api-design/styles/">Styles</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/api-design/packaging/') ? 'highlighted selected' : ''}><a href="docs/api-design/packaging/">Packaging</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/api-design/glossary/') ? 'highlighted selected' : ''}><a href="docs/api-design/glossary/">Glossary</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/api-design/logs/') ? 'highlighted selected' : ''}><a href="docs/api-design/logs/">Logs</a></nve-tree-node>
<a href="/docs/api-design/">API Design</a>
<nve-tree-node ${data.page.url.includes('/docs/api-design/properties-attributes/') ? 'highlighted selected' : ''}><a href="/docs/api-design/properties-attributes/">Properties & Attributes</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/api-design/slots/') ? 'highlighted selected' : ''}><a href="/docs/api-design/slots/">Slots</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/api-design/registration/') ? 'highlighted selected' : ''}><a href="/docs/api-design/registration/">Registration</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/api-design/custom-events/') ? 'highlighted selected' : ''}><a href="/docs/api-design/custom-events/">CustomEvents</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/api-design/stateless/') ? 'highlighted selected' : ''}><a href="/docs/api-design/stateless/">Stateless</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/api-design/composition/') ? 'highlighted selected' : ''}><a href="/docs/api-design/composition/">Composition</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/api-design/styles/') ? 'highlighted selected' : ''}><a href="/docs/api-design/styles/">Styles</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/api-design/packaging/') ? 'highlighted selected' : ''}><a href="/docs/api-design/packaging/">Packaging</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/api-design/glossary/') ? 'highlighted selected' : ''}><a href="/docs/api-design/glossary/">Glossary</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/api-design/logs/') ? 'highlighted selected' : ''}><a href="/docs/api-design/logs/">Logs</a></nve-tree-node>
</nve-tree-node>

<nve-tree-node ${data.page.url.includes('/docs/internal/guidelines') ? 'expanded' : ''} ${data.page.url === '/docs/internal/guidelines/' ? 'highlighted' : ''}>
<a href="docs/internal/guidelines/agent-harness/">Internal Guidelines</a>
<nve-tree-node ${data.page.url.includes('/docs/internal/guidelines/agent-harness/') ? 'highlighted selected' : ''}><a href="docs/internal/guidelines/agent-harness/">Agent Harness</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/internal/guidelines/agent-tooling/') ? 'highlighted selected' : ''}><a href="docs/internal/guidelines/agent-tooling/">Agent Tooling</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/internal/guidelines/agent-ownership/') ? 'highlighted selected' : ''}><a href="docs/internal/guidelines/agent-ownership/">Agent Ownership</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/internal/guidelines/documentation/') ? 'highlighted selected' : ''}><a href="docs/internal/guidelines/documentation/">Documentation</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/internal/guidelines/examples/') ? 'highlighted selected' : ''}><a href="docs/internal/guidelines/examples/">Examples</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/internal/guidelines/typescript/') ? 'highlighted selected' : ''}><a href="docs/internal/guidelines/typescript/">TypeScript</a></nve-tree-node>
<nve-tree-node ${data.page.url === '/docs/internal/guidelines/testing/' ? 'highlighted selected' : ''}><a href="docs/internal/guidelines/testing/">Testing</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/internal/guidelines/testing-unit/') ? 'highlighted selected' : ''}><a href="docs/internal/guidelines/testing-unit/">Unit Testing</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/internal/guidelines/testing-accessibility/') ? 'highlighted selected' : ''}><a href="docs/internal/guidelines/testing-accessibility/">Accessibility Testing</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/internal/guidelines/testing-lighthouse/') ? 'highlighted selected' : ''}><a href="docs/internal/guidelines/testing-lighthouse/">Lighthouse Testing</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/internal/guidelines/testing-ssr/') ? 'highlighted selected' : ''}><a href="docs/internal/guidelines/testing-ssr/">SSR Testing</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/internal/guidelines/testing-visual/') ? 'highlighted selected' : ''}><a href="docs/internal/guidelines/testing-visual/">Visual Testing</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/internal/guidelines/troubleshooting/') ? 'highlighted selected' : ''}><a href="docs/internal/guidelines/troubleshooting/">Troubleshooting</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/internal/guidelines/component-creation/') ? 'highlighted selected' : ''}><a href="docs/internal/guidelines/component-creation/">Component Creation</a></nve-tree-node>
<a href="/docs/internal/guidelines/agent-harness/">Internal Guidelines</a>
<nve-tree-node ${data.page.url.includes('/docs/internal/guidelines/agent-harness/') ? 'highlighted selected' : ''}><a href="/docs/internal/guidelines/agent-harness/">Agent Harness</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/internal/guidelines/agent-tooling/') ? 'highlighted selected' : ''}><a href="/docs/internal/guidelines/agent-tooling/">Agent Tooling</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/internal/guidelines/agent-ownership/') ? 'highlighted selected' : ''}><a href="/docs/internal/guidelines/agent-ownership/">Agent Ownership</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/internal/guidelines/documentation/') ? 'highlighted selected' : ''}><a href="/docs/internal/guidelines/documentation/">Documentation</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/internal/guidelines/examples/') ? 'highlighted selected' : ''}><a href="/docs/internal/guidelines/examples/">Examples</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/internal/guidelines/typescript/') ? 'highlighted selected' : ''}><a href="/docs/internal/guidelines/typescript/">TypeScript</a></nve-tree-node>
<nve-tree-node ${data.page.url === '/docs/internal/guidelines/testing/' ? 'highlighted selected' : ''}><a href="/docs/internal/guidelines/testing/">Testing</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/internal/guidelines/testing-unit/') ? 'highlighted selected' : ''}><a href="/docs/internal/guidelines/testing-unit/">Unit Testing</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/internal/guidelines/testing-accessibility/') ? 'highlighted selected' : ''}><a href="/docs/internal/guidelines/testing-accessibility/">Accessibility Testing</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/internal/guidelines/testing-lighthouse/') ? 'highlighted selected' : ''}><a href="/docs/internal/guidelines/testing-lighthouse/">Lighthouse Testing</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/internal/guidelines/testing-ssr/') ? 'highlighted selected' : ''}><a href="/docs/internal/guidelines/testing-ssr/">SSR Testing</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/internal/guidelines/testing-visual/') ? 'highlighted selected' : ''}><a href="/docs/internal/guidelines/testing-visual/">Visual Testing</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/internal/guidelines/troubleshooting/') ? 'highlighted selected' : ''}><a href="/docs/internal/guidelines/troubleshooting/">Troubleshooting</a></nve-tree-node>
<nve-tree-node ${data.page.url.includes('/docs/internal/guidelines/component-creation/') ? 'highlighted selected' : ''}><a href="/docs/internal/guidelines/component-creation/">Component Creation</a></nve-tree-node>
</nve-tree-node>

<nve-tree-node ${data.page.url.includes('examples/') ? 'expanded' : ''} ${data.page.url === 'examples/' ? 'highlighted' : ''}>
<a href="examples/">Internal Examples</a>
<nve-tree-node ${data.page.url.includes('examples/') ? 'highlighted selected' : ''}><a href="examples/">All Examples</a></nve-tree-node>
<a href="/examples/">Internal Examples</a>
<nve-tree-node ${data.page.url.includes('examples/') ? 'highlighted selected' : ''}><a href="/examples/">All Examples</a></nve-tree-node>

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

find . -name "common.js" -path "*/_11ty/layouts/*" 2>/dev/null | head -5

Repository: NVIDIA/elements

Length of output: 103


🏁 Script executed:

fd "common.js" projects/site/src/_11ty/layouts/ 2>/dev/null

Repository: NVIDIA/elements

Length of output: 101


🏁 Script executed:

find projects -name "common.js" 2>/dev/null | grep layouts

Repository: NVIDIA/elements

Length of output: 101


🏁 Script executed:

ls -la projects/site/src/_11ty/layouts/ 2>/dev/null

Repository: NVIDIA/elements

Length of output: 670


🏁 Script executed:

find . -type f -name "*.js" | grep -i "common" | head -10

Repository: NVIDIA/elements

Length of output: 883


🏁 Script executed:

rg "renderDocsNav" --type js -l 2>/dev/null

Repository: NVIDIA/elements

Length of output: 146


🏁 Script executed:

rg "export const renderDocsNav" -A 5 2>/dev/null

Repository: NVIDIA/elements

Length of output: 1158


🏁 Script executed:

find projects -type f \( -name "*.js" -o -name "*.ts" \) | head -20

Repository: NVIDIA/elements

Length of output: 704


🏁 Script executed:

ls -la projects/ 2>/dev/null

Repository: NVIDIA/elements

Length of output: 1020


🏁 Script executed:

rg "data.page.url.includes\('\\/\\.\\/'" 2>/dev/null

Repository: NVIDIA/elements

Length of output: 41


🏁 Script executed:

rg "data.page.url.includes.*\\.\\/" -A 2 -B 2 2>/dev/null

Repository: NVIDIA/elements

Length of output: 41


🏁 Script executed:

git ls-files | grep -i "common.js" 2>/dev/null | head -5

Repository: NVIDIA/elements

Length of output: 101


🏁 Script executed:

rg "nve-tree-node.*examples/" -C 3 2>/dev/null

Repository: NVIDIA/elements

Length of output: 2708


🏁 Script executed:

rg "Getting Started.*Installation.*CLI" -l 2>/dev/null

Repository: NVIDIA/elements

Length of output: 41


🏁 Script executed:

git ls-files | wc -l && git ls-files | head -30

Repository: NVIDIA/elements

Length of output: 939


🏁 Script executed:

rg "data\.page\.url\.includes\('/\./'\)" 2>/dev/null

Repository: NVIDIA/elements

Length of output: 256


🏁 Script executed:

rg "/\\./|/\./" 2>/dev/null | head -20

Repository: NVIDIA/elements

Length of output: 256


🏁 Script executed:

rg "Datagrid.*Column Action" 2>/dev/null | head -5

Repository: NVIDIA/elements

Length of output: 41


🏁 Script executed:

rg "Internal Examples.*All Examples" 2>/dev/null

Repository: NVIDIA/elements

Length of output: 41


🏁 Script executed:

cat .gitignore 2>/dev/null | head -20

Repository: NVIDIA/elements

Length of output: 362


🏁 Script executed:

ls -la | head -20

Repository: NVIDIA/elements

Length of output: 1249


🏁 Script executed:

pwd && ls -R | head -100

Repository: NVIDIA/elements

Length of output: 1720


🏁 Script executed:

git log --name-only --pretty="" | grep common.js | head -5

Repository: NVIDIA/elements

Length of output: 269


🏁 Script executed:

git ls-files "**/common.js"

Repository: NVIDIA/elements

Length of output: 101


🏁 Script executed:

rg "renderDocsNav" 2>/dev/null

Repository: NVIDIA/elements

Length of output: 361


🏁 Script executed:

rg "nve-tree-node" -l 2>/dev/null | head -10

Repository: NVIDIA/elements

Length of output: 520


🏁 Script executed:

rg "Patterns.*Authentication" -l 2>/dev/null

Repository: NVIDIA/elements

Length of output: 118


🏁 Script executed:

find . -type f -name "*.html" -o -name "*.hbs" -o -name "*.njk" 2>/dev/null | head -20

Repository: NVIDIA/elements

Length of output: 998


🏁 Script executed:

rg -g "*.js" "export const" 2>/dev/null | grep -i "nav\|render" | head -10

Repository: NVIDIA/elements

Length of output: 233


🏁 Script executed:

python3 - <<'PY'
import os
import subprocess

try:
    result = subprocess.run(['git', 'ls-files'], capture_output=True, text=True, timeout=5)
    files = result.stdout.strip().split('\n')
    candidates = [f for f in files if 'common' in f.lower() or 'nav' in f.lower() or '_11ty' in f]
    for f in candidates[:30]:
        print(f)
except Exception as e:
    print(f"Error: {e}")
PY

Repository: NVIDIA/elements

Length of output: 1572


🏁 Script executed:

rg "Agent Harness" -C 2 2>/dev/null | head -20

Repository: NVIDIA/elements

Length of output: 1603


🏁 Script executed:

git status 2>/dev/null | head -10

Repository: NVIDIA/elements

Length of output: 413


🏁 Script executed:

git log --oneline --all 2>/dev/null | head -10

Repository: NVIDIA/elements

Length of output: 621


🏁 Script executed:

find . -type f | wc -l && find . -type f -name "*.js" | wc -l

Repository: NVIDIA/elements

Length of output: 72


🏁 Script executed:

cat -n projects/site/src/_11ty/layouts/common.js | sed -n '130,400p'

Repository: NVIDIA/elements

Length of output: 40809


🏁 Script executed:

wc -l projects/site/src/_11ty/layouts/common.js

Repository: NVIDIA/elements

Length of output: 105


🏁 Script executed:

sed -n '132,145p' projects/site/src/_11ty/layouts/common.js

Repository: NVIDIA/elements

Length of output: 1612


🏁 Script executed:

sed -n '390,410p' projects/site/src/_11ty/layouts/common.js

Repository: NVIDIA/elements

Length of output: 1353


🏁 Script executed:

grep -n "data.page.url.includes('/\./'" projects/site/src/_11ty/layouts/common.js

Repository: NVIDIA/elements

Length of output: 218


🏁 Script executed:

grep -n "examples/" projects/site/src/_11ty/layouts/common.js

Repository: NVIDIA/elements

Length of output: 582


🏁 Script executed:

grep -B 5 -A 5 "/\./" projects/site/src/_11ty/layouts/common.js

Repository: NVIDIA/elements

Length of output: 1455


🏁 Script executed:

sed -n '132,155p' projects/site/src/_11ty/layouts/common.js | cat -n

Repository: NVIDIA/elements

Length of output: 3494


🏁 Script executed:

sed -n '388,398p' projects/site/src/_11ty/layouts/common.js | cat -n

Repository: NVIDIA/elements

Length of output: 1339


🏁 Script executed:

git log -p --follow -S "/\./" -- projects/site/src/_11ty/layouts/common.js 2>/dev/null | head -100

Repository: NVIDIA/elements

Length of output: 41


🏁 Script executed:

grep -n "data.page.url" projects/site/src/_11ty/layouts/common.js | head -20

Repository: NVIDIA/elements

Length of output: 3503


🏁 Script executed:

python3 - <<'PY'
import re

with open('projects/site/src/_11ty/layouts/common.js', 'r') as f:
    lines = f.readlines()

# Look at lines around the /./  pattern
start = 135
end = 145
print("=== Lines around /\./ pattern ===")
for i in range(start-1, min(end, len(lines))):
    print(f"{i+1}: {lines[i]}", end='')

print("\n=== Lines around examples/ pattern ===")
start = 388
end = 398
for i in range(start-1, min(end, len(lines))):
    print(f"{i+1}: {lines[i]}", end='')

# Check all selection patterns
print("\n=== All data.page.url pattern checks (sample) ===")
for i, line in enumerate(lines, 1):
    if 'data.page.url' in line and ('includes' in line or 'endsWith' in line or '===' in line):
        print(f"{i}: {line.strip()[:100]}")
        if i > 160:  # Only show first few
            break
PY

Repository: NVIDIA/elements

Length of output: 5107


Remove dead /./ pattern and fix examples/ path inconsistency.

Line 136 contains redundant logic: data.page.url.includes('/./') || data.page.url === '/'. The /./ pattern never occurs naturally in URLs and serves no purpose—the fallback check data.page.url === '/' already handles the root path case. Remove the dead code.

Lines 394–396 have a path mismatch: the URL checks use examples/ (no leading slash), but the href uses /examples/ (with leading slash). This breaks navigation highlighting when users visit /examples/. All other navigation items consistently check paths with leading slashes (e.g., includes('/docs/...')). Update the checks to use '/examples/' with a leading slash.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@projects/site/src/_11ty/layouts/common.js` around lines 132 - 396, In the
renderDocsNav function, there are two issues to fix. First, remove the dead code
pattern in the first nve-tree-node where the expanded attribute checks include a
redundant `/./` pattern that never occurs naturally in URLs. The check
`data.page.url.includes('/./') || data.page.url === '/'` should be simplified to
just `data.page.url === '/'` since the OR condition with the root path already
handles all necessary cases. Second, fix the path inconsistency in the final
nve-tree-node for the Internal Examples section where the URL checks use
`'examples/'` without a leading slash, but the href attribute uses
`'/examples/'` with a leading slash. Update all the URL check patterns in this
section to use `'/examples/'` with a leading slash to be consistent with how all
other navigation sections check their paths (e.g., `includes('/docs/...')`).

Comment on lines +94 to +121
it('should preserve source module urls when building production output', async () => {
const { siteUrlsTransform } = await importTransform('build');
const html = `
<script type="module" src="https://nvidia.github.io/elements/404/index.ts"></script>
<img src="/static/images/integrations/angular.svg" alt="Angular logo">
`;

const result = await siteUrlsTransform.call(createContext(), html, 'index.html');

expect(result).toContain('src="/404/index.ts"');
expect(result).toContain('src="https://nvidia.github.io/elements/static/images/integrations/angular.svg"');
});

it('should preserve source module urls when building for local preview', async () => {
const { siteUrlsTransform } = await importTransform('build', {
localPreview: true,
pagesBaseUrl: '/elements/preview/'
});
const html = `
<script type="module" src="https://nvidia.github.io/elements/preview/404/index.ts"></script>
<img src="/static/images/integrations/angular.svg" alt="Angular logo">
`;

const result = await siteUrlsTransform.call(createContext(), html, 'index.html');

expect(result).toContain('src="/404/index.ts"');
expect(result).toContain('src="/elements/preview/static/images/integrations/angular.svg"');
});

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick | 🔵 Trivial | ⚡ Quick win

Add an explicit non-module <script src> case.

Current assertions cover module scripts only. Add one non-module script test to lock expected behavior around script URL rewriting.

Suggested test addition
   it('should preserve source module urls when building for local preview', async () => {
@@
     expect(result).toContain('src="/404/index.ts"');
     expect(result).toContain('src="/elements/preview/static/images/integrations/angular.svg"');
   });
+
+  it('should define behavior for non-module script src urls', async () => {
+    const { siteUrlsTransform } = await importTransform('build');
+    const html = '<script src="/docs/runtime.js"></script>';
+    const result = await siteUrlsTransform.call(createContext(), html, 'index.html');
+    expect(result).toContain('<script src="/docs/runtime.js"></script>');
+  });
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@projects/site/src/_11ty/transforms/site-urls.test.ts` around lines 94 - 121,
The test cases for siteUrlsTransform in the test file currently only cover
module scripts with type="module" attributes, leaving non-module script URL
rewriting behavior untested. Add test assertions within one or both of the
existing test cases (the production output test and the local preview test) that
verify the expected behavior when a regular non-module script tag with a src
attribute is processed by siteUrlsTransform. Include an assertion that confirms
the URL transformation for a non-module script follows the same transformation
rules as the other assets being tested.

<a href="/docs/integrations/typescript/">{% svg-logo 'typescript' '18' %} TypeScript</a>
</nve-button>
<nve-button>
{% svg-logo 'lit' '20' %} Lit</a>

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Verify HTML structure in support.md around the Lit button
fd -e md 'support.md' | xargs grep -n "svg-logo 'lit'" -A 1 -B 1

Repository: NVIDIA/elements

Length of output: 257


🏁 Script executed:

sed -n '20,40p' projects/site/src/docs/about/support.md | cat -n

Repository: NVIDIA/elements

Length of output: 988


🏁 Script executed:

# Check if a lit integration page exists
find projects/site/src/docs/integrations -name "*lit*" 2>/dev/null

# Check the file against Vale prose linter rules for the .md file
if command -v vale &> /dev/null; then
  vale projects/site/src/docs/about/support.md 2>&1 | grep -A 2 -B 2 "line 31"
else
  echo "Vale not available in sandbox"
fi

Repository: NVIDIA/elements

Length of output: 183


Fix malformed HTML: Lit button is missing opening <a> tag.

Line 31 has {% svg-logo 'lit' '20' %} Lit</a> with a closing </a> tag but no opening <a href="..."> tag. This breaks HTML structure and removes the link functionality. All other framework buttons (TypeScript, Angular, Vue, Preact) have properly paired anchor tags. Since /docs/integrations/lit.md exists, add the corresponding link: <a href="/docs/integrations/lit/">.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@projects/site/src/docs/about/support.md` at line 31, The Lit button on line
31 has a closing `</a>` tag without a corresponding opening `<a>` tag, breaking
the link functionality. Add an opening `<a>` tag with
href="/docs/integrations/lit/" before the svg-logo template tag in the Lit
button element to properly pair with the existing closing `</a>` tag and match
the structure of the other framework buttons (TypeScript, Angular, Vue, Preact)
which all have properly formed anchor links.

Comment on lines +102 to +104
Apply the `nve-layout` attribute to **native HTML elements** rather than Elements components. Use semantic HTML elements like `<section>`, `<main>`, `<nav>`, `<aside>`, or generic containers like `<div>` as your layout containers. Similarly, [form components have built-in layout capabilities](/docs/elements/forms/#form-layouts).

For more details, see the documentation on the [internal-host pattern](/elements/docs/api-design/styles/#internal-host) and [slots](/elements/docs/api-design/slots/) which the library uses in development, as well as [MDN docs](https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_shadow_DOM) on the Shadow DOM.
For more details, see the documentation on the [internal-host pattern](/docs/api-design/styles/#internal-host) and [slots](/docs/api-design/slots/) which the library uses in development, as well as [MDN docs](https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_shadow_DOM) on the Shadow DOM.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Verify that referenced documentation pages exist
echo "Checking /docs/elements/forms documentation..."
fd -t f 'forms' projects/site/src/docs/elements --max-depth 2

echo "Checking /docs/api-design documentation..."
fd -t f 'styles\|slots' projects/site/src/docs/api-design --max-depth 2

Repository: NVIDIA/elements

Length of output: 149


🏁 Script executed:

#!/bin/bash
# Check the actual structure of the docs directory
echo "=== Directory structure of projects/site/src/docs ==="
ls -la projects/site/src/docs

echo ""
echo "=== Subdirectories ==="
find projects/site/src/docs -maxdepth 2 -type d | head -20

echo ""
echo "=== All markdown files in docs ==="
find projects/site/src/docs -name "*.md" -type f | sort

Repository: NVIDIA/elements

Length of output: 11550


🏁 Script executed:

#!/bin/bash
# Check the actual content at lines 102-104 of the file
echo "=== Content at lines 102-104 of index.md ==="
sed -n '100,110p' projects/site/src/docs/foundations/layout/index.md

echo ""
echo "=== Broader context: lines 90-115 ==="
sed -n '90,115p' projects/site/src/docs/foundations/layout/index.md

Repository: NVIDIA/elements

Length of output: 2481


🏁 Script executed:

#!/bin/bash
# Check for form-layouts heading/anchor in forms documentation
echo "=== Checking for 'form-layouts' in forms/index.md ==="
grep -n "form-layout\|Form Layout" projects/site/src/docs/elements/forms/index.md

echo ""
echo "=== Checking for 'internal-host' in api-design/styles.md ==="
grep -n "internal-host\|Internal Host" projects/site/src/docs/api-design/styles.md

echo ""
echo "=== Full content of forms/index.md to verify structure ==="
wc -l projects/site/src/docs/elements/forms/index.md
head -100 projects/site/src/docs/elements/forms/index.md

Repository: NVIDIA/elements

Length of output: 2787


🏁 Script executed:

#!/bin/bash
# Check the full content of styles.md for internal-host
echo "=== Content of api-design/styles.md ==="
cat projects/site/src/docs/api-design/styles.md

Repository: NVIDIA/elements

Length of output: 15668


Fix incorrect anchor reference in documentation link.

The link /docs/api-design/styles/#internal-host on line 103 is broken. The styles documentation uses the heading ## **_REMOVED_** Host, not ## Internal Host, so the anchor would not resolve to #internal-host. Verify and correct the anchor reference to match the actual heading structure in that document.

The other two references are correct:

  • /docs/elements/forms/#form-layouts matches the heading ## Form layouts
  • /docs/api-design/slots/ points to an existing page
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@projects/site/src/docs/foundations/layout/index.md` around lines 102 - 104,
The anchor reference in the link pointing to
`/docs/api-design/styles/#internal-host` is incorrect because the actual heading
in the styles documentation is `## **_REMOVED_** Host`, not `## Internal Host`.
Update the anchor portion of this link to match the actual heading structure in
the styles documentation so it resolves correctly. Verify what the actual anchor
should be based on the current heading in that document and correct the
reference accordingly.

- [toast](./docs/elements/toast/): contextual notification
- [notification](./docs/elements/notification/): async non contextual notification
- [drawer](./docs/elements/drawer/): interactive navigation or extra contextual content
- [tooltip](/docs/elements/tooltip/): contextual text only hints

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Fix hyphenation in compound adjectives.

Two lines contain compound adjectives that should be hyphenated:

  • Line 15: "contextual text only hints" → "contextual text-only hints"
  • Line 20: "async non contextual notification" → "async non-contextual notification"

When adjectives modify nouns, they should be hyphenated for clarity.

Grammar fixes
- [tooltip](/docs/elements/tooltip/): contextual text only hints
+ [tooltip](/docs/elements/tooltip/): contextual text-only hints

- [notification](/docs/elements/notification/): async non contextual notification
+ [notification](/docs/elements/notification/): async non-contextual notification

Also applies to: 20-20

🧰 Tools
🪛 LanguageTool

[grammar] ~15-~15: Use a hyphen to join words.
Context: ...docs/elements/tooltip/): contextual text only hints - [toggletip](/docs/elements/...

(QB_NEW_EN_HYPHEN)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@projects/site/src/docs/foundations/popovers.md` at line 15, Fix the
hyphenation in two compound adjectives in the popovers.md documentation. In the
tooltip link description, change "contextual text only hints" to "contextual
text-only hints" by adding a hyphen between "text" and "only". Additionally, in
the notification-related text, change "async non contextual notification" to
"async non-contextual notification" by adding a hyphen between "non" and
"contextual". These hyphens are necessary because the adjectives modify the
nouns that follow them as compound modifiers.

Source: Linters/SAST tools

- [Unit Tests (`.test.ts`)](/docs/internal/testing/unit/): Standard behavior tests.
- [Accessibility Tests (`.test.axe.ts`)](/docs/internal/testing/accessibility/): best practices tests using axe-core.
- [Lighthouse Performance Tests (`.test.lighthouse.ts`)](/docs/internal/testing/lighthouse/): performance audits and best practices via Lighthouse
- [Visual Regression Tests (`.test.visual.ts`)](/docs/internal/testing/ssr/): Visual regression tests using Playwright screenshots.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Check if a dedicated visual regression testing page exists
fd -e md 'visual' projects/site/src/docs/internal/testing --type f

# List all testing subdirectories
find projects/site/src/docs/internal/testing -maxdepth 1 -type d

Repository: NVIDIA/elements

Length of output: 261


🏁 Script executed:

#!/bin/bash
# Find the testing.md file mentioned in the review
fd -i testing.md --type f

# Explore the docs directory structure
find . -type d -name "docs" | head -5
find . -type d -name "testing" | head -10

Repository: NVIDIA/elements

Length of output: 1145


🏁 Script executed:

#!/bin/bash
# Read the testing.md file around lines 44-45
cat -n projects/site/src/docs/internal/guidelines/testing.md | sed -n '40,50p'

# Explore the docs/internal directory structure
find projects/site/src/docs/internal -maxdepth 2 -type d | sort

Repository: NVIDIA/elements

Length of output: 841


🏁 Script executed:

#!/bin/bash
# List all subdirectories under docs/internal
find projects/site/src/docs/internal -type d | sort

# Specifically look for testing-related directories
ls -la projects/site/src/docs/internal/ 2>/dev/null || echo "Directory not found"

# Check if there's a testing directory
ls -la projects/site/src/docs/internal/testing 2>/dev/null || echo "testing dir not found"

Repository: NVIDIA/elements

Length of output: 385


🏁 Script executed:

#!/bin/bash
# Search for any testing-related markdown files in the docs directory
find projects/site/src/docs -name "*.md" -type f | xargs grep -l "test\|Test" | head -20

# Check the structure of the entire docs/internal directory
tree projects/site/src/docs/internal 2>/dev/null || find projects/site/src/docs/internal -type f

# Search for any ssr or visual related content in docs
find projects/site/src/docs -type f \( -name "*ssr*" -o -name "*visual*" \)

Repository: NVIDIA/elements

Length of output: 1760


🏁 Script executed:

#!/bin/bash
# Check the content of the testing-visual.md and testing-ssr.md files to understand the structure
cat -n projects/site/src/docs/internal/guidelines/testing-visual.md | head -10

cat -n projects/site/src/docs/internal/guidelines/testing-ssr.md | head -10

# Search for how other links are formatted in the testing.md file
cat -n projects/site/src/docs/internal/guidelines/testing.md | head -50

# Check if there's any documentation about the link format in the repo
grep -r "docs/internal/" projects/site/src/docs --include="*.md" | head -5

Repository: NVIDIA/elements

Length of output: 3161


🏁 Script executed:

#!/bin/bash
# Verify the link pattern by checking a known correct link
# Search for how the unit testing link is rendered/served
grep -r "/docs/internal/testing/unit" projects/site/src --include="*.ts" --include="*.js" --include="*.11ty.js" 2>/dev/null | head -5

# Check if there's a routing or layout file that explains how these paths map to files
find projects/site/src -name "*.11ty.js" -o -name "*.config.*" | xargs grep -l "docs\|testing" 2>/dev/null | head -10

# Check the front matter or config in testing-visual.md for its served path
head -20 projects/site/src/docs/internal/guidelines/testing-visual.md

# Check the front matter in testing-ssr.md for its served path  
head -20 projects/site/src/docs/internal/guidelines/testing-ssr.md

Repository: NVIDIA/elements

Length of output: 1482


🏁 Script executed:

#!/bin/bash
# Check if there's documentation on how URLs are routed in this 11ty site
cat projects/site/src/_11ty/layouts/docs.11ty.js | grep -A 10 -B 10 "url\|path\|permalink" | head -40

# Look for any routing configuration
find projects/site -name ".eleventy.js" -o -name "eleventy.config.js" | xargs cat 2>/dev/null | head -100

Repository: NVIDIA/elements

Length of output: 5608


Fix all incorrect link paths in test type list (lines 41-45).

The links in lines 41-45 all point to /docs/internal/testing/*/ but this directory doesn't exist. The actual documentation files are in /docs/internal/guidelines/testing-*.md and should link to /docs/internal/guidelines/testing-*/. Line 44 should link to /docs/internal/guidelines/testing-visual/, not /docs/internal/testing/ssr/.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@projects/site/src/docs/internal/guidelines/testing.md` at line 44, All the
markdown links in the test type list (lines 41-45) are using incorrect paths
pointing to `/docs/internal/testing/*/` which doesn't exist. Update all five
links to use the correct path structure `/docs/internal/guidelines/testing-*/`
instead. Specifically, ensure line 44 updates the Visual Regression Tests link
from `/docs/internal/testing/ssr/` to
`/docs/internal/guidelines/testing-visual/`, and apply similar corrections to
the other test type links on lines 41, 42, 43, and 45 by replacing the
`/docs/internal/testing/` portion with `/docs/internal/guidelines/testing-` in
each link.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Pull requests that update a dependency file scope(ci) scope(core) scope(docs)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants